QFuture与std::future 异步调用样例

实现场景:

前端维护一个进度条,后端进行异步调用,查询状态。为防止用户界面被阻塞故采用异步操作调用。

std::future 可以理解为一个轻型Thread

std::future 相对于QtConcurrent ,std::future不要求传入函数必须为static声明,这大大提高了灵活性。

参考链接:std::future<T>::wait_for - cppreference.com

代码实现:

    QProgressDialog *m_pProgressDialog =
        new QProgressDialog(tr("Checking..."),tr("Cancel"),0,0,this);
    m_pProgressDialog->show();


    /*检测目标平台与填写的是否一致*/
    std::future<bool>  ans = std::async(/*std::launch::async,*/[&](){
        return CheckWorkPlatForm();
    });

    std::future_status status=ans.wait_for(std::chrono::milliseconds(50));

    while(status!=std::future_status::ready){

        status=ans.wait_for(std::chrono::milliseconds(50));

        //刷新绘制窗口
        QApplication::processEvents();
    }

    if(m_pProgressDialog->wasCanceled()){
        return;
    }

拓展:QThread 的一个轻型调用

 QThread *thread = QThread::create([&i](){
        for(;i<1000;i++){
            qDebug() << "Hello from thread" << QThread::currentThread();
        }
    });

 补充说明:

经测试上述调用会引发Qt的未知异常,在成应用程序闪退,异常又将其修改回使用Qt官方类 QFuture。尚不明确引发问题的原因。

posted @ 2024-08-16 13:51  BlackSnow  阅读(60)  评论(0)    收藏  举报