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