Qt多线程编程中的对象线程与函数执行线程


近来用Qt编写一段多线程的TcpSocket通信程序,被其中Qt中报的几个warning搞晕了,一会儿是说“Cannot create children for a parent that is in a different thread”,有时候又是“QSocketNotifier: socket notifiers cannot be enabled from another thread”,还经常又Assert failure:Cannot send events toobjects owned by a different thread,从而导致程序崩溃。

为彻底搞清原因并解决问题,在查阅大量资料和Qt文档之后,理清了其中的机制,也对多线程编程中的QObject对象创建以及connect执行有更清楚的认识:

1. 一个对象的线程就是创建该对象时的线程,而不论该对象的定义是保存在那个线程中;

2. QObject的connect函数有几种连接方式,

a) DirectConnection,信号发送后槽函数立即执行,由sender的所在线程执行;

b) QueuedConnection,信号发送后返回,相关槽函数由receiver所在的线程在返回到事件循环后执行;

c) 默认使用的是Qt::AutoConnection,当sender和receiver在同一个线程内时,采用DirectConnection的方式,当sender和receiver在不同的线程时,采用QueuedConnection的方式。

为了更清楚的理解这些问题,在此特编了个小例子说明一下。首先定义一个从QObject继承的类SomeObject,包含一个信号someSignal和一个成员函数callEmitSignal,此函数用于发送前面的someSignal信号。定义如下:

// define Object class

  1. class SomeObject : public QObject  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     SomeObject(QObject* parent=0) : QObject(parent) {}  
  6.     void callEmitSignal()  // 用于发送信号的函数   
  7.     {  
  8.         emit someSignal();  
  9.     }  
  10. signals:  
  11.     void someSignal();  
  12. }; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 下一页

相关内容