Qt之QThread用法
QThread類提供了與系統(tǒng)無關(guān)的線程。
QThread代表在程序中一個(gè)單獨(dú)的線程控制。線程在run()中開始執(zhí)行,默認(rèn)情況下,run()通過調(diào)用exec()啟動(dòng)事件循環(huán)并在線程里運(yùn)行一個(gè)Qt的事件循環(huán)。
當(dāng)線程started()和finished()時(shí),QThread會(huì)通過一個(gè)信號(hào)通知你,可以使用isFinished()和isRunning()來查詢線程的狀態(tài)。
你可以通過調(diào)用exit()或quit()來停止線程。在極端情況下,可能要強(qiáng)行terminate()一個(gè)執(zhí)行線程。但是,這樣做很危險(xiǎn),下面會(huì)詳細(xì)說明。
從Qt4.8起,可以釋放運(yùn)行剛剛結(jié)束的線程對(duì)象,通過連接finished()信號(hào)到QObject::deleteLater()槽。
使用wait()來阻塞調(diào)用的線程,直到其它線程執(zhí)行完畢(或者直到指定的時(shí)間過去)。
QThread還提供了靜態(tài)的、平臺(tái)獨(dú)立的休眠函數(shù):sleep()、msleep()、usleep(),允許秒,毫秒和微秒來區(qū)分,這些函數(shù)在Qt5.0中被設(shè)為public。
注意:一般情況下,wait()和sleep()函數(shù)應(yīng)該不需要,因?yàn)镼t是一個(gè)事件驅(qū)動(dòng)型框架。考慮監(jiān)聽finished()信號(hào)來取代wait(),使用QTimer來取代sleep()。
靜態(tài)函數(shù)currentThreadId()和currentThread()返回標(biāo)識(shí)當(dāng)前正在執(zhí)行的線程。前者返回該線程平臺(tái)特定的ID,后者返回一個(gè)線程指針。
要設(shè)置線程的名稱,可以在啟動(dòng)線程之前調(diào)用setObjectName()。如果不調(diào)用setObjectName(),線程的名稱將是線程對(duì)象的運(yùn)行時(shí)類型(QThread子類的類名)。
可以將常用的接口按照功能進(jìn)行以下分類
線程啟動(dòng) void start(Priority priority = InheritPriority)[slot]? 調(diào)用后會(huì)執(zhí)行run()函數(shù),但在run()函數(shù)執(zhí)行前會(huì)發(fā)射信號(hào)started(),操作系統(tǒng)將根據(jù)優(yōu)先級(jí)參數(shù)調(diào)度線程。如果線程已經(jīng)在運(yùn)行,那么這個(gè)函數(shù)什么也不做。優(yōu)先級(jí)參數(shù)的效果取決于操作系統(tǒng)的調(diào)度策略線程執(zhí)行 int exec() [protected] 進(jìn)入事件循環(huán)并等待直到調(diào)用exit(),返回值是通過調(diào)用exit()來獲得,如果調(diào)用成功則范圍0。 void run() [virtual protected] 線程的起點(diǎn),在調(diào)用start()之后,新創(chuàng)建的線程就會(huì)調(diào)用這個(gè)函數(shù),默認(rèn)實(shí)現(xiàn)調(diào)用exec(),大多數(shù)需要重新實(shí)現(xiàn)這個(gè)函數(shù),便于管理自己的線程。該方法返回時(shí),該線程的執(zhí)行將結(jié)束。
線程退出 void quit() [slot] 告訴線程事件循環(huán)退出,返回0表示成功,相當(dāng)于調(diào)用了QThread::exit(0)。 void exit(int returnCode = 0) 告訴線程事件循環(huán)退出。調(diào)用這個(gè)函數(shù)后,線程離開事件循環(huán)后返回,QEventLoop::exec()返回returnCode,按照慣例,0表示成功;任何非0值表示失敗。 void requestInterruption() 請(qǐng)求線程的中斷。該請(qǐng)求是咨詢意見并且取決于線程上運(yùn)行的代碼,來決定是否及如何執(zhí)行這樣的請(qǐng)求。此函數(shù)不停止線程上運(yùn)行的任何事件循環(huán),并且在任何情況下都不會(huì)終止它。
線程等待 void msleep(unsigned long msecs) [static] 強(qiáng)制當(dāng)前線程睡眠msecs毫秒 void sleep(unsigned long secs) [static] 強(qiáng)制當(dāng)前線程睡眠secs秒 void usleep(unsigned long usecs) [static] 強(qiáng)制當(dāng)前線程睡眠usecs微秒 bool wait(unsigned long time = ULONG_MAX) 線程將會(huì)被阻塞,等待time毫秒。和sleep不同的是,如果線程退出,wait會(huì)返回。
線程狀態(tài) bool isFinished() const 線程是否結(jié)束 bool isRunning() const 線程是否正在運(yùn)行
線程優(yōu)先級(jí) void setPriority(Priority priority) 設(shè)置正在運(yùn)行線程的優(yōu)先級(jí)。如果線程沒有運(yùn)行,此函數(shù)不執(zhí)行任何操作并立即返回。使用的start()來啟動(dòng)一個(gè)線程具有特定的優(yōu)先級(jí)。優(yōu)先級(jí)參數(shù)可以是QThread::Priority枚舉除InheritPriortyd的任何值。 枚舉QThread::Priority:
| QThread::IdlePriority | 0 | 沒有其它線程運(yùn)行時(shí)才調(diào)度 |
| QThread::LowestPriority | 1 | 比LowPriority調(diào)度頻率低 |
| QThread::LowPriority | 2 | 比NormalPriority調(diào)度頻率低 |
| QThread::NormalPriority | 3 | 操作系統(tǒng)的默認(rèn)優(yōu)先級(jí) |
| QThread::HighPriority | 4 | 比NormalPriority調(diào)度頻繁 |
| QThread::HighestPriority | 5 | 比HighPriority調(diào)度頻繁 |
| QThread::TimeCriticalPriority | 6 | 盡可能頻繁的調(diào)度 |
| QThread::InheritPriority | 7 | 使用和創(chuàng)建線程同樣的優(yōu)先級(jí). 這是默認(rèn)值 |
采取合理的措施來優(yōu)雅地結(jié)束線程,一般思路:
當(dāng)主線程調(diào)用stop()更新m_bStopped的時(shí)候,run()函數(shù)也極有可能正在訪問它(這時(shí),他們處于不同的線程),所以存在資源競爭,因此需要加鎖,保證共享數(shù)據(jù)的安全性。 主線程會(huì)調(diào)用deleteLater,然后自動(dòng)調(diào)用析構(gòu)函數(shù)!
總結(jié)
以上是生活随笔為你收集整理的Qt之QThread用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019北京理工大学计算机专硕经验分享
- 下一篇: 处理大并发之四 libevent dem