当前位置:网站首页>Qt5多线程/线程池技术集锦(2)如何在子线程更新ui窗口
Qt5多线程/线程池技术集锦(2)如何在子线程更新ui窗口
2022-08-06 16:26:00 【libaineu2004】
上一篇介绍了基础知识
Qt5多线程/线程池技术集锦(1)基础知识篇_libaineu2004的博客-CSDN博客_qt5 线程池
Qt下多线程的几种使用方法, 以及注意事项
第一种方法:
1. 创建一个类从QThread类派生
2. 在子线程类中重写 run 函数, 将处理操作写入该函数中
3. 在主线程中创建子线程对象, 启动子线程, 调用start()函数
第二种方法:
1. 将业务处理抽象成一个业务类, 在该类中创建一个业务处理函数
2. 在主线程中创建一QThread类对象
3. 在主线程中创建一个业务类对象
4. 将业务类对象移动到子线程中
5. 在主线程中启动子线程
6. 通过信号槽的方式, 执行业务类中的业务处理函数
第三种方法:
QFuture<void> f1 = QtConCurrent::run(processFun, command)
多线程使用注意事项:
1. 业务对象, 构造的时候不能指定父对象
2. 子线程中不能处理ui窗口(ui相关的类)
3. 子线程中只能处理一些数据相关的操作, 不能涉及窗口
这篇讲讲多线程里怎么更新窗口ui
第一种方法:
子线程发信号给主线程,更新UI。通过信号槽的机制可以实现,子线程发信号给主线程即可。不会阻塞。
启动线程
m_future_2d_SectionChart = QtConcurrent::run(this, &FormContent::thread_draw2D_SectionChart);
子线程
void FormContent::thread_draw2D_SectionChart(void)//绘制2D截面图
{
qDebug() << "sub thread id:" << QThread::currentThreadId();
connect(this, SIGNAL(sig_updateUI_SectionChart()), this, SLOT(slot_updateUI_SectionChart()));
while (true)
{
//去主线程更新UI
emit sig_updateUI_SectionChart();
}
}
主线程
void FormContent::slot_updateUI_SectionChart(void)//更新2D截面图
{
qDebug() << "main thread id:" << QThread::currentThreadId();
m_pFormTimeline->updateSectionChart();
}第二种方法:(推荐)
我们可以在线程函数里使用QMetaObject::invokeMethod来实现异步更新ui
举例如下:
1.主界面里面有个控件QTextBrowser
2.子线程在执行数据计算,最终想把计算结果输出到控件QTextBrowser
3.Qt子线程不能操作UI,必须发送到主线程。那么在线程执行函数里,这样写:
QMetaObject::invokeMethod(qApp, [this, equivalentX, equivalentY] {
ui->textBrowser_ret->append(tr("equivalent估值,x:%1mm").arg(equivalentX));
ui->textBrowser_ret->append(tr("equivalent估值,y:%1mm").arg(equivalentY));
});关于QMetaObject::invokeMethod的原理,可以参见6.5大侠的教程
边栏推荐
- 湖仓一体电商项目(七):业务需求和分层设计及流程图
- Douyin slider verification scheme s_v_web_id parameter analysis
- SAP ABAP OData 服务的分页加载数据集的实现(Paging)试读版
- 训练阶段yolov7主干部分结构图
- 海缆探测仪TSS350(三)
- 13. SAP ABAP OData 服务的分页加载数据集的实现(Paging)
- leetcode-每日一题1408. 数组中的字符串匹配(暴力枚举)和Golang里关于Index方法和Contains方法区别
- 西工大&ANU&CSIRO&IIAI提出基于排序的伪装目标检测网络RankNet,并提供了最大的COD数据集!...
- 小程序图片转base64方案(多种解决方案)
- JVM:(四)运行时数据区之程序计数器
猜你喜欢

阿里首本凤凰架构竟要付费,构建大型分布式系统的指南这么宝贵吗

Dreamweaving document for the manuscript to be reviewed causes the tag tag document to disappear bug fix

企业级监控服务器构建

织梦文档为待审核稿件引起tag标签文档消失bug修复

Computational Protein Design with Deep Learning Neural Networks

RTU通讯控制器S274如何操作

【着色器实现FishEye鱼眼画面膨胀效果_Shader效果第十六篇】

7 public accounts with excellent reputation!

1408. 数组中的字符串匹配
![In-depth understanding of AVLTree [rotation control balance (single rotation, double rotation)]](/img/8c/c2d8c29bb07735f1b584a1f90de2e5.png)
In-depth understanding of AVLTree [rotation control balance (single rotation, double rotation)]
随机推荐
云原生正在吞噬一切,开发者该如何应对?
leetcode-每日一题1408. 数组中的字符串匹配(暴力枚举)和Golang里关于Index方法和Contains方法区别
理解xss,csrf,ddos攻击原理以及避免方式
数据查询优化技术方案
【freertos】013-任务通知及其实现细节
RL-D1电流继电器
[GO]go-micro介绍
The JVM: (3) the runtime data area
LeetCode: 206. The inversion list - simple
Google的工程实践指南(下):代码开发者指南
一天学习一家上市公司:绝味食品
LeetCode: 392. Judgment Subsequence —— Simple
MT6853/MT6873 视频彩铃概率性无图像
瑞吉外卖项目实战Day05
如何用WebGPU流畅渲染千万级2D物体:基于光追管线
阿里架构师力推jvm架构解析文档,把JVM调优实战讲的明明白白
织梦后台发布文章编辑出现一片空白的解决办法
dedecms证明手机站下一篇变上一篇而且还出错Request Error!
13. SAP ABAP OData 服务的分页加载数据集的实现(Paging)
全排列问题2