一共三个线程
线程1:发送信号
线程2:发送信号
线程3:接收信号在槽函数中进行处理
线程1和线程2同时发送信号给线程3,槽函数执行了两次,但有一次只执行了一半是什么呢
这可能是由于线程间的竞争条件导致的。具体来说,当线程1和线程2同时发送信号给线程3时,线程3的槽函数可能会同时运行两次,但其中一个槽函数可能在某个关键时刻被另一个槽函数中断了,导致只执行了一部分。这种情况下,需要在槽函数中添加线程同步机制,例如互斥锁或条件变量,以确保每个槽函数的执行都是顺序的,避免竞争条件的发生。
线程中不要操作UI
搜一搜委托操作UI
- 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7519088
- 这篇博客也不错, 你可以看下QT笔记- 显示实时信息、滚屏信息、类似软件安装滚动消息、类似控制台的输出控件
- 除此之外, 这篇博客: Qt 开发经验总结中的 很多初学者甚至几年工作经验的人,对多线程有很深的误解和滥用,尤其是在串口和网络通信这块,什么都往多线程里面丢,一旦遇到界面卡,就把数据收发啥的都搞到多线程里面去,殊不知绝大部分时候那根本没啥用,因为没找到出问题的根源。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
- 如果你没有使用wait***函数的话,大部分的界面卡都出在数据处理和展示中,比如传过来的是一张图片的数据,你需要将这些数据转成图片,这个肯定是耗时的;
- 还有就是就收到的数据曲线绘制出来,如果过于频繁或者间隔过短,肯定会给UI造成很大的压力的,最好的办法是解决如何不要频繁绘制UI比如合并数据一起绘制等;
- 如果是因为绘制UI造成的卡,那多线程也是没啥用的,因为UI只能在主线程;
- 串口和网络的数据收发默认都是异步的,由操作系统调度的,如果数据处理复杂而且数据量大,你要做的是将数据处理放到多线程中;
- 如果没有严格的数据同步需求,根本不需要调用wait***之类的函数来立即发送和接收数据,实际需求中大部分的应用场景其实异步收发数据就足够了;
- 有严格数据同步需求的场景还是放到多线程会好一些,不然你wait***就卡在那边了;
- 多线程是需要占用系统资源的,理论上来说,如果线程数量超过了CPU的核心数量,其实多线程调度可能花费的时间更多,各位在使用过程中要权衡利弊;
- 您还可以看一下 黄强老师的Qt框架绘图高级编程、仪表盘、折线图、饼图、柱状图、K线图课程中的 Qt漂亮预警仪表盘项目创建小节, 巩固相关知识点