Qt多線程(一)
在多線程應用程序中,圖形用戶界面運行於它自己的線程中,而另外的事件處理則會發生在一個或多個其它線程中。這樣做之后,即使在處理那些數據密集的事件時,應用程序也能對圖形用戶界面保持響應。當在一個單處理器上運行時,多線程應用程序可能會比實現同樣功能的單線程應用程序運行得更慢一些,無法體現出其優勢。但是在目前多處理器系統越來越普及的情況下,多線程應用程序可以在不同的處理器中同時執行多個線程,從而獲得更好的總體性能。Qt給程序員提供了實現多線程的模塊,程序員可以使用兩種方式創建多線程應用程序。
Qt創建多線程應用程序的一種方法如下:
1)首先實例化QThread類,並重寫QThread的虛函數run();代碼如下:
//myThread.h
class myThread : public QThread { Q_OBJECT public: explicit myThread(QObject *parent = 0);protected: void run(); };
//myThread.cpp
myThread::myThread(QObject *parent) : QThread(parent) { } void myThread::run() { qDebug()<<"子線程 id="<<QThread::currentThread(); //打印子線程ID }
在myThread類中,只有run()函數是線程執行函數,其它定義函數都不是線程執行函數。通過線程ID可以測試。
2)主線程中使用myThread類,啟動子線程;
//主線程.h文件 #include "mythread.h" private: myThread* thread; myThread* thread1;
//主線程.cpp文件 ThreadTest::ThreadTest(QWidget *parent) : QWidget(parent), ui(new Ui::ThreadTest) { ui->setupUi(this); thread = new myThread(this); thread1 = new myThread(this); qDebug()<<"主線程 id="<<QThread::currentThread(); thread->start(); thread1->start(); }
使用start()函數啟動子線程。運行輸出:
通過打印出的兩個子線程的id和主線程id說明子線程啟動成功。
3)子線程的關閉
通過處理窗口關閉的信號調用quit()函數關閉子線程;
thread->quit();
thread1->quit();