C++ 提升 : call function from parent thread

标签 c++ boost-thread

我正在尝试创建一个线程来回调创建该线程的对象的函数。但似乎无法将“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/

相关文章:

c++ - vector 下标超出 vector vector 的范围

c++ - 在 C++ 结构中重载运算符 << 和 >>

C++ 链表遗留代码到 STL——动态分配链表大小

c++ - 请推荐一本关于使用 boost.thread 或 C++11 进行多线程处理的有值(value)的书

c++ - 删除 boost::thread 后代

c++ - boost::_bi::unwrapper<F>::unwrap 不能作为函数使用?

c++ - 使用平面数组存储的元组容器

c++ - 如何将外部库静态链接到我的可执行文件中?

sockets - Boost Asio,io_service每个内核仅处理一个套接字

c++ - 如何在阻塞调用周围实现定时等待?