您好,登錄后才能下訂單哦!
編寫QT程序時,時常會需要使用定時器QTimer來執行一些定時任務,但當定時任務執行的時間過長,則會影響整個界面的響應,因此會想到使用另一個工作線程來執行定時器,一般情況下可以選擇從QThread派生一個線程類,然后重載run并執行任務邏輯,那下面就介紹一個不用從QThread派生并使用QTimer的例子。
主窗口類頭文件加入:
[cpp] view plain copy
QThread* _voiceThread;
QTimer* _voiceTimer;
構造函數加入:
[cpp] view plain copy
// 使用一個線程,跑定時器
_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();
析構函數加入:
[cpp] view plain copy
emit stop();
_voiceThread->quit();
_voiceThread->wait();
delete _voiceTimer;
delete _voiceThread;
定時器槽:
[cpp] view plain copy
void Test::_onVoiceTimeout()
{
// 執行任務
// ...
_voiceTimer->start(1000);
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。