作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员
QThread继承自QObject,它发射信号(signals)以表明线程执行开始或结束,并提供了一些槽函数(slots)。
更有趣的是,QObjects可以在多线程中使用,发射信号以在其它线程中调用槽函数,并且向“存活”于其它线程中的对象发送事件(post events)。这是可能的,因为每一个线程都拥有它自身的事件循环(event loop)。
QObject可重入性
QObject是可重入的。它的大多数非GUI子类,例如:QTimer、QTcpSocket、QUdpSocket和QProcess,也都是可重入的,这使得在多线程中同时使用这些类成为可能。**注意:**这些类被设计成在单一线程中创建和使用的,在一个线程中创建一个对象而在另一个线程中调用该对象的函数,不保证能行得通。需要注意有三个约束:
-
一个QObject类型的孩子必须总是被创建在它的父亲所被创建的线程中。这意味着,除了别的以外,永远不要把QThread对象(this)作为该线程中创建的一个对象的父亲(因为QThread对象自身被创建在另外一个线程中)。
-
事件驱动的对象可能只能被用在一个单线程中。特别是,这适用于计时器机制(timer mechanism)和网络模块。例如:你不能在不属于这个对象的线程中启动一个定时器或连接一个socket,必须保证在删除QThrea
本文详细介绍了Qt中的线程和QObjects的使用,包括QObject的可重入性、每个线程的事件循环、从其他线程访问QObject子类以及跨线程的信号和槽。强调了QThread的事件循环、线程安全问题以及信号槽的四种连接类型,特别指出Direct Connection在不同线程间的不安全性,并提供了Mandelbrot和Blocking Fortune Client两个示例来说明实践中的应用。
订阅专栏 解锁全文
376





