gpt4 book ai didi

C++ 提升 : call function from parent thread

转载 作者:行者123 更新时间:2023-11-28 02:48:00 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com