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

私のプログラムは「実行」メソッドの「else」に入らず、状態がロードされていない間、プログラムは「this->thread->get()」でスタックします。

どうすればそれを処理できますか?

ありがとう!

4

2 に答える 2

1

何が問題なのかわかりませんが、 wait_forColiruでコンパイルされた)を使用したアイデアは次のとおりです。

#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 に答える