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。尚不明确引发问题的原因。

浙公网安备 33010602011771号