我想在c ++ 11中检测线程结束,但我不知道该怎么做,它看起来像是“get”块程序,这就是我所做的:
void Object::init()
{
this->thread = std::async( std::launch::async, &State::load, stateInstance );
}
/* A method in a loop */
void Object::run()
{
bool ready = this->thread.get();
if( ready )
{
/* do something */
}
else
{
/* draw interface, manage event, … */
}
}
我的程序没有进入“运行”方法中的“else”,程序停留在“this-> thread-> get()”状态,而状态未加载。
我该如何处理?
谢谢!
答案 0 :(得分:1)
我不确定问题是什么,但是这是一个使用wait_for
(compiled on Coliru)的想法:
#include <future>
#include <chrono>
#include <iostream>
struct State
{
void load() {
std::cout << "working\n";
std::this_thread::sleep_for(std::chrono::seconds(4));
std::cout << "done\n";
}
};
struct Object
{
/* A method in a loop */
bool run()
{
switch(future.wait_for(std::chrono::milliseconds(100)))
{
case std::future_status::ready:
{
/* do something */
}
return false;
case std::future_status::timeout:
{
/* draw interface, manage event, … */
}
case std::future_status::deferred:
default:
return true;
}
}
Object() { init(); }
~Object() { if (future.valid()) future.wait(); }
private:
void init()
{
future = std::async(std::launch::async, &State::load, &stateInstance);
}
State stateInstance;
std::future<void> future;
};
int main()
{
Object test;
while (test.run());
}
答案 1 :(得分:0)
试试这个
while(!this->thread.valid())
{ //do smthg
}else{
}
你的get lock,因为get想要检索未来的结果 - &gt;线程。因此它会等待这个结果准备就绪,并将其返回。
有效,只需判断此未来结果是否准备就绪