QT为什么只能由主线程操作UI

发布时间 2023-06-25 19:23:40作者: 3的4次方

QT为什么只能由主线程操作UI

背景

QT中,每次子线程去更新Ui都要通过信号槽去刷。其实不光是QT,很多GUI程序框架都是这么规定的。

主线程:主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()启动事件循环的线程。

原因

直接原因:UI 线程负责和用户交互,因此不能长时间阻塞。因此耗时任务必须开启一个后台线程来完成。

根本原因

  • 多线程操作一个UI,很容易导致或者极其容易导致反向加锁和死锁问题。
  • 刷新UI,得走显卡吧,得刷显存吧,得排队吧,得阻塞吧,涉及到IO还得中断的事件,你敢并发?你以为加锁就ok了?锁能锁住线程,锁不住IO

参考:为什么大多数程序子线程都不能刷新UI? - 知乎 (zhihu.com)