Qt有一套完整而独特的设计理念,其signal-slot机制需要有QEventLoop
支持。
由于Qt4.4对QThread
类进行了大改,把它的run()
方法从纯虚函数变成了默认调用exec()
。这让仅提供消息循环的线程不再需要派生QThread
。但网上搜QThread
会有大量古老参考资料,提供了很多不友好的写法。以至于Qt开发人员Bradley T. Hughes愤怒地写了一篇《you are-doing-it-wrong》 (TrollTech网站已经倒了,链接失效了)来批判错误写法们。
现行的准官方的推荐实践是(在线程里有消息循环的情况下)
定义一个普通的QObject派生类,然后将其对象move到QThread中。使用信号和槽时根本不用考虑多线程的存在。也不用使用QMutex来进行同步,Qt的事件循环会自己自动处理好这个。
具体请参考这篇:《Qt 的线程与事件循环》。