1. 程式人生 > >QT 啟動新執行緒執行QTimer

QT 啟動新執行緒執行QTimer

編寫QT程式時,時常會需要使用定時器QTimer來執行一些定時任務,但當定時任務執行的時間過長,則會影響整個介面的響應,因此會想到使用另一個工作執行緒來執行定時器,一般情況下可以選擇從QThread派生一個執行緒類,然後過載run並執行任務邏輯,那下面就介紹一個不用從QThread派生並使用QTimer的例子。

1.主視窗類標頭檔案加入:

_voiceThread = new QThread;
_voiceTimer = new QTimer;

2.建構函式加入:

_voiceThread = new QThread;
_voiceTimer = new QTimer;
_voiceTimer->
setSingleShot(true); //定時器單次處罰 /* 在moveToThread前先啟動定時器,不然不在一個執行緒裡,直接呼叫start會失敗 */ _voiceTimer->start(200); _voiceTimer->moveToThread(_voiceThread); /* 定時器物件和this不在一個執行緒裡面,因此這邊指定了連線方式為Qt::DirectConnection,由定時器所線上程直接觸發_onVoiceTimeout */ connect(_voiceTimer, SIGNAL(timeout()), this, SLOT(_onVoiceTimeout()), Qt::DirectConnection
); /* 連線定時器槽,用來停止定時器 */ connect(this, SIGNAL(stop()), _voiceTimer, SLOT(stop())); /* 啟動執行緒 */ _voiceThread->start();

3.解構函式加入:

emit stop();
_voiceThread->quit();
_voiceThread->wait();
delete _voiceTimer;
delete _voiceThread;

4.定時器槽:

void Test::_onVoiceTimeout()
{
 // 執行任務
 // ...
 _voiceTimer->start(1000
); }

注: 第二次啟動定時器的時候,發現沒有觸發槽函式,,,需要重新 new + connect