24

グラフィック アプリケーションで、別のスレッドでバッチ メッシュを生成したいと考えています。したがって、を使用してメンバー関数を非同期で呼び出しますstd::async

task = async(launch::async, &Class::Meshing, this, Data(...));

私の更新ループでは、スレッドの準備ができているかどうかを確認しようとしています。はいの場合、メッシュをビデオ カードに送信し、次のスレッドを開始します。そうでない場合は、これらの操作をスキップします。

#include <future>
using namespace std;

class Class
{
public:
    void Update()
    {
        if(task.finished()) // this method does not exist
        {
            Data data = task.get();
            // ...
            task = async(launch::async, &Class::Meshing, this, Data(/* ... */));
        }
    }

private:
    struct Data
    {
        // ...
    };
    future<Data> task;
    Data Meshing(Data data)
    {
        // ...
    }
};

非同期スレッドが更新機能でスタックせずに終了したかどうかを確認するにはどうすればよいですか?

4

1 に答える 1

20

を使用しfuture::wait_for()ます。タイムアウトを指定し、その後ステータス コードを取得できます。

例:

task.wait_for(std::chrono::seconds(1));

future_status::readyこれは、future_status::deferredまたはを返すfuture_status::timeoutので、操作のステータスがわかります。タイムアウトを 0 に指定して、チェックをできるだけ早く返すこともできます。

于 2013-01-11T21:46:10.173 に答える