如何检查STD::异步任务是否完成?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (15)

在我的图形应用程序中,我想在另一个线程中生成批处理网格。所以我异步调用成员函数使用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)
    {
        // ...
    }
};

我怎样才能检查异步线程完成没有更新功能?

提问于
用户回答回答于

使用future::wait_for()。你可以指定超时时间,然后获取状态码。

例:

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

这将返回future_status::readyfuture_status::deferred或者future_status::timeout,因此你知道操作的状态。你也可以指定超时值0以使检查尽快立即返回。

扫码关注云+社区