溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

QT用線程啟動(dòng)定時(shí)器

發(fā)布時(shí)間:2020-07-17 07:03:31 來(lái)源:網(wǎng)絡(luò) 閱讀:918 作者:WZM3558862 欄目:開(kāi)發(fā)技術(shù)

    編寫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

  1. QThread* _voiceThread;  

  2. QTimer* _voiceTimer;  


構(gòu)造函數(shù)加入:



[cpp] view plain copy

  1. // 使用一個(gè)線程,跑定時(shí)器  

  2. _voiceThread = new QThread;  

  3. _voiceTimer = new QTimer;  

  4. _voiceTimer->setSingleShot(true);  

  5. // 在moveToThread前先啟動(dòng)定時(shí)器,不然不在一個(gè)線程里,直接調(diào)用start會(huì)失敗  

  6. _voiceTimer->start(200);  

  7. _voiceTimer->moveToThread(_voiceThread);  

  8. // 定時(shí)器對(duì)象和this不在一個(gè)線程里面,因此這邊指定了連接方式為Qt::DirectConnection,由定時(shí)器所在線程直接觸發(fā)_onVoiceTimeout  

  9. connect(_voiceTimer, SIGNAL(timeout()), this, SLOT(_onVoiceTimeout()), Qt::DirectConnection);  

  10. // 連接定時(shí)器槽,用來(lái)停止定時(shí)器  

  11. connect(this, SIGNAL(stop()), _voiceTimer, SLOT(stop()));  

  12. _voiceThread->start();  


析構(gòu)函數(shù)加入:



[cpp] view plain copy

  1. emit stop();  

  2. _voiceThread->quit();  

  3. _voiceThread->wait();  

  4.   

  5. delete _voiceTimer;  

  6. delete _voiceThread;  


定時(shí)器槽:



[cpp] view plain copy

  1. void Test::_onVoiceTimeout()  

  2. {  

  3.     // 執(zhí)行任務(wù)  

  4.     // ...  

  5.     _voiceTimer->start(1000);  

  6. }  


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI