qt为什么只能在主线程里进行UI *** 作

qt为什么只能在主线程里进行UI *** 作,第1张

的确是这样。主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()。exec()启动了事件循环,一镇埋直在等待接收并且处理一个个Qt封装好的事件,比如鼠标移动事件,键盘按下事件等等。所以只有在主线程里你才可以方便利用各种Event去完成自己想要实现的需求。所以就限制你必须在主线程作UI相关 *** 作。

除了规定,往根源说,再多的线程,实质上对于CPU来说,也是一件一件的处理,并不是我们凭空现象的同时处理。只是可以“智能”的处理一下当前迫切需要的数据,然后可以随时暂停,再去处理更加迫切御羡蚂的。如果2个线程同时处派贺理UI显示,一个线程正在用于和用户交互更新显示,另外一个线程就只能是等待状态,并不能完成我们所期望的同时刷新UI的期望。

所以,基本上大部分应用开发框架都限制更新、创建UI必须在主线程里完成,而逻辑运算可以匹出新线程去完成。

多线程,越方便越快捷也就越容易隐藏bug,多线程间数据同步很容易搞乱,互斥量、读写锁、信号、共享等等。想要多线程同步处理UI更新,你也要给伟大的框架开发程序员们一些时间呵呵……

我提供两种比较简单的解决方案

创建一个Receiver的QObject, 该对象必须生存在你继承的线衡笑唯程中

要么给该对象升盯构造对应的信号, 然后与你主线程窗体进行Connect, 一般来说是Queue的Connection

然后在子线程只要Emit你所实现的信号即可

或者用postEvent来解决, 自定义一种咐培Event, 然后持有主线程窗体对象, 然后PostEvent给主线程窗体对象

其实也比较简单,在主线程中调用delete A(这里A是class A new出来的一个对象),然后在calss A的析构函数里执行乎穗如下代码:

m_thread.requestInterruption()

m_thread.quit()

//m_thread.wait()

requestInterruption()按照字面意思是请求中断,这样就可以从阻塞的地方暂时跑出来,然后执行quit来结束腔局这个线程。注意,不要在后面使用wait(),这样的话也会再次伍顷让被阻塞。

这样的话,在程序退出时,虽然会提示程序异常结束,但是那个阻塞的子线程的确也结束掉了。所以,我将该方法命名为不优雅退出阻塞线程法。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12312918.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存