我正在尝试创建一个线程来回调创建该线程的对象的函数。但似乎无法将“this”作为参数传递。有没有办法实现这个?提前致谢。
Helper.cpp
void Helper::ProcessSomething(void (*callback)(void))
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
callback();
}
一些类.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;
}
最佳答案
问题是 SomeCallback
不是静态的(至少不是我能看到的),所以 thread
中还有另一个 this
未说明> 的构造函数。此外,因为它不是静态的,所以您不能将 SomeCallback
转换为 ProcessSomething
需要的 void(*)(void)
。
最简单的修复方法就是将 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 而不是绑定(bind):
void SomeClass::Start(void)
{
Helper *helper = Helper();
boost::thread t(&Helper::ProcessSomething, helper, [this]() { SomeCallback(); });
t.join();
}
关于C++ 提升 : call function from parent thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23744385/