A QThread instance represents a thread and provides the means to start() a thread, which will then execute the reimplementation of QThread::run(). The run() implementation is for a thread what the main() entry point is for the application.

## Usage 1-0

For example

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  #include class Thread : public QThread { private: void run() { qDebug()<<"From worker thread: "<

From main thread:  0x15a8


## Usage 1-1

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54  #if QT_VERSION>=0x050000 #include #else #include #endif class Thread : public QThread { Q_OBJECT public: Thread():m_stop(false) {} public slots: void stop() { qDebug()<<"Thread::stop called from main thread: "<

From main thread:  0x13a8


## Usage 1-2 (错误的使用方式)

• 将超时信号连接到线程中的槽函数上
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35  #include class Thread : public QThread { Q_OBJECT private slots: void onTimeout() { qDebug()<<"Thread::onTimeout get called from? : "<

From main thread:  0x13a4


Oh, No!!! 它为什么在主线程中被调用了！

### 如何解决这个问题

 1   connect(&timer, SIGNAL(timeout()), this, SLOT(onTimeout()), Qt::DirectConnection); 

 1   moveToThread(this) 

## Usage 1-3

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41  #include class Worker : public QObject { Q_OBJECT private slots: void onTimeout() { qDebug()<<"Worker::onTimeout get called from?: "<

From main thread:  0x810
Worker::onTimeout get called from?:  0xfac
Worker::onTimeout get called from?:  0xfac
Worker::onTimeout get called from?:  0xfac


## Usage 2-0

• 创建一个工作对象
• 建立信号与槽的连接
• 将工作对象移至子线程中
• 启动线程
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  #include class Worker : public QObject { Q_OBJECT private slots: void onTimeout() { qDebug()<<"Worker::onTimeout get called from?: "<

From main thread:  0x1310
Worker::onTimeout get called from?:  0x121c
Worker::onTimeout get called from?:  0x121c
Worker::onTimeout get called from?:  0x121c


Usage 2-1

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug()<<"From main thread: "<

• 信号 timeout() 是由子线程发送出去的。
• 定时器和工作对象是在同一线程当中的，它们的连接方式直接连接。
• 槽函数的调用和信号的触发是在同一线程中的。

• 信号timeout() 是由主线程发出的。
• 定时器和工作对象是在不同的线程中，它们的连接方式队列连接。
• 槽函数是在子线程中被调用。

• 由于队列连接机制的存在，可以安全的将信号和槽函数在不同的线程中连接起来。如果所有的跨线程通信都通过队列连接方式，那么多线程的互斥防范机制将不在需要。

## 总结

• 在事件处理存在时使用对象时将它们移至线程中时很简单的，这样将事件处理和队列连接的细节给隐藏了。

05-31 5497

08-06 2万+

03-22 8万+

07-10 1万+

07-23 5万+

08-11 1856

09-06 1487

03-03 264

09-01 38