C ++ Boost:从父线程调用函数

时间:2014-05-19 18:06:54

标签: c++ boost-thread

我试图创建一个线程来回调创建线程的对象的函数。但似乎无法通过"这个"作为参数。有没有办法实现这个?提前谢谢。

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;
}

1 个答案:

答案 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();
}