1

我想在 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, … */
    }
}

我的程序在“run”方法中没有进入“else”,程序在未加载状态时卡在“this->thread->get()”上。

我该如何处理?

谢谢!

4

2 回答 2

1

我不确定问题出在哪里,但这是一个使用wait_for在 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());
}
于 2013-09-02T21:36:50.080 回答
0

尝试这个

while(!this->thread.valid())
{ //do smthg
}else{
}

您的 get 锁定,因为 get 想要检索未来 this->thread 的结果。因此它会等待这个结果准备好,然后返回它。

有效只是告诉这个未来的结果是否准备好

于 2013-09-02T21:11:06.117 回答