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::deferredfuture_status::timeout,因此您知道操作的状态。您还可以将超时时间指定为 0 以使检查尽快返回。

于 2013-01-11T21:46:10.173 回答