QT为什么只能由主线程操作UI
背景
QT中,每次子线程去更新Ui都要通过信号槽去刷。其实不光是QT,很多GUI程序框架都是这么规定的。
主线程:主线程是唯一允许创建QApplication
或者QCoreApplication
对象的,并且调用exec()
启动事件循环的线程。
原因
直接原因:UI 线程负责和用户交互,因此不能长时间阻塞。因此耗时任务必须开启一个后台线程来完成。
根本原因:
- 多线程操作一个UI,很容易导致或者极其容易导致反向加锁和死锁问题。
- 刷新UI,得走显卡吧,得刷显存吧,得排队吧,得阻塞吧,涉及到IO还得中断的事件,你敢并发?你以为加锁就ok了?锁能锁住线程,锁不住IO
参考:为什么大多数程序子线程都不能刷新UI? - 知乎 (zhihu.com)
标签:加锁,QT,主线,线程,IO,UI From: https://www.cnblogs.com/3to4/p/17503768.html