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。尚不明确引发问题的原因。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!