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