您好,登錄后才能下訂單哦!
編寫QT程序時(shí),時(shí)常會(huì)需要使用定時(shí)器QTimer來(lái)執(zhí)行一些定時(shí)任務(wù),但當(dāng)定時(shí)任務(wù)執(zhí)行的時(shí)間過(guò)長(zhǎng),則會(huì)影響整個(gè)界面的響應(yīng),因此會(huì)想到使用另一個(gè)工作線程來(lái)執(zhí)行定時(shí)器,一般情況下可以選擇從QThread派生一個(gè)線程類,然后重載run并執(zhí)行任務(wù)邏輯,那下面就介紹一個(gè)不用從QThread派生并使用QTimer的例子。
主窗口類頭文件加入:
[cpp] view plain copy
QThread* _voiceThread;
QTimer* _voiceTimer;
構(gòu)造函數(shù)加入:
[cpp] view plain copy
// 使用一個(gè)線程,跑定時(shí)器
_voiceThread = new QThread;
_voiceTimer = new QTimer;
_voiceTimer->setSingleShot(true);
// 在moveToThread前先啟動(dòng)定時(shí)器,不然不在一個(gè)線程里,直接調(diào)用start會(huì)失敗
_voiceTimer->start(200);
_voiceTimer->moveToThread(_voiceThread);
// 定時(shí)器對(duì)象和this不在一個(gè)線程里面,因此這邊指定了連接方式為Qt::DirectConnection,由定時(shí)器所在線程直接觸發(fā)_onVoiceTimeout
connect(_voiceTimer, SIGNAL(timeout()), this, SLOT(_onVoiceTimeout()), Qt::DirectConnection);
// 連接定時(shí)器槽,用來(lái)停止定時(shí)器
connect(this, SIGNAL(stop()), _voiceTimer, SLOT(stop()));
_voiceThread->start();
析構(gòu)函數(shù)加入:
[cpp] view plain copy
emit stop();
_voiceThread->quit();
_voiceThread->wait();
delete _voiceTimer;
delete _voiceThread;
定時(shí)器槽:
[cpp] view plain copy
void Test::_onVoiceTimeout()
{
// 執(zhí)行任務(wù)
// ...
_voiceTimer->start(1000);
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。