QT 啟動新執行緒執行QTimer
阿新 • • 發佈:2019-02-16
編寫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