我试图创建一个线程来回调创建线程的对象的函数。但似乎无法通过"这个"作为参数。有没有办法实现这个?提前谢谢。
Helper.cpp
void Helper::ProcessSomething(void (*callback)(void))
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
callback();
}
SomeClass.cpp
void SomeClass::Start(void)
{
Helper *helper = Helper();
boost::thread t(&Helper::ProcessSomething, helper, &this->SomeCallback);
t.join();
}
void SomeClass::SomeCallback(void)
{
std::cout << "Callback called" << std::endl;
}
答案 0 :(得分:2)
问题是SomeCallback
不是静态的(至少不是我能看到的),因此在this
的构造函数中还有另一个thread
未列出的值。此外,由于它不是静态的,因此您无法将SomeCallback
转换为void(*)(void)
所需的ProcessSomething
。
最简单的解决方法是将SomeCallback
设为静态(并将&this->SomeCallback
更改为&SomeClass::SomeCallback
)。但是,如果你不能,这是一个可能的解决方法(我假设你没有C ++ 11):
void Helper::ProcessSomething(boost::function<void()> callback)
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
callback();
}
// ...
void SomeClass::Start(void)
{
Helper *helper = Helper();
boost::function<void()> callback = boost::bind(&SomeClass::SomeCallback, this);
boost::thread t(&Helper::ProcessSomething, helper, callback);
t.join();
}
如果你有C ++ 11(但是想要使用boost :: thread),你可以使用lambda而不是绑定:
void SomeClass::Start(void)
{
Helper *helper = Helper();
boost::thread t(&Helper::ProcessSomething, helper, [this]() { SomeCallback(); });
t.join();
}