c++ Boost:从父线程调用函数
C++ Boost: call function from parent thread
我试图让一个线程回调创建线程的对象的函数。但似乎不可能将"this"作为参数传递。有办法实现这一点吗?提前谢谢。
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;
}
问题是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而不是绑定:
void SomeClass::Start(void)
{
Helper *helper = Helper();
boost::thread t(&Helper::ProcessSomething, helper, [this]() { SomeCallback(); });
t.join();
}
相关文章:
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 非静态成员失败的线程调用函数
- 线程调用的函数对对象删除是否安全?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 通过 Qt 中的线程调用 Rust 库
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 由并发无序映射查找线程调用的函数是否安全?
- 如何从另一个线程调用颤振引擎方法
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 从多个线程调用 std::shuffle
- std::thread::join() 可以从非父线程调用吗?
- 如何使用 Win32 API 从 Excel VBA 中的非"Single-Threaded Apartment"线程调用 InternetGetProxyInfo
- 带参数的线程调用库函数
- 如何在本机C++中跨线程调用(在主线程上回调)
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 优雅断言函数不是从多个线程调用的
- 从第二个线程调用Qt信号有效 - >对连接的插槽没有影响
- 包装标准::线程调用函数
- 从 Visual C++ 2010 中的单独线程调用消息框