Qt QThread必須要瞭解的幾個函數

概述

    如果想對Qt中的QThread有個更加深刻的瞭解,必須要知道這幾個重要的函數,現在就一一介紹下。

函數介紹

屬性 返回值 函數體 功能
static QThread * QThread::currentThread() 返回當前線程的指針,靜態函數。
static Qt::HANDLE QThread::currentThreadId() 返回當前線程的句柄,靜態函數
static bool QThread::isFinished() const 如果線程執行結束,返回true,否則返回false
static bool QThread::isRunning() const 如果當前線程在運行中,返回true,否則返回false
static int QThread::idealThreadCount() 返回理理想狀態下該系統支持的線程的數量。如果無發現檢測到處理器的核數,返回值爲-1
protected int exec() 使線程進入事件循環狀態,並且處於wait狀態,直到調用exit()函數使其退出。退出時返回值是調用exit()函數時的輸入參數。如果調用quit()函數,其退出的返回值爲0.該函數一般在run()函數中調用,使線程進入事件循環處理狀態。
protected void exit(int returnCode = 0) 告知線程從事件循環狀態退出,並且返回returnCode的值。一般說來,返回0表示成功退出,返回非0值表示遇到錯誤。調用該函數後,線程不會再進行事件處理,除非再次調用exec()函數。如果當前線程不處於執行狀態,那麼下次調用exec()也會直接返回
private signal void finished()

在線程執行完畢前發出該信號,當發出該信號時,意味着線程早已經退出了事件循環處理狀態,即不再處理除了延遲刪除事件(deferred deletion)之外的任何事件。可以把該信號和QObject::deleteLater()連接起來用來刪除線程中的對象。如果強制使用terminate()函數來結束線程,那麼將無法得知finish()信號的發送線程。另外,這是一個私有信號,所以用戶無法發出這個信號。

static bool QThread::isInterruptionRequested() const 返回當前線程上運行的任務是否可以停止,可以通過requestInterruption()來進行中斷查詢。該函數可以使得長時間運行的任務徹底停止,永遠不要檢查該函數的返回值是否是安全的。但是進行長時間任務時提倡有規律的使用該方法。但是不要頻繁使用該方法避免線程切換的開銷。
static bool QThread::isRunning() const 返回當前線程是否正在運行,如果在運行,返回true,否則返回false
static int QThread::loopLevel() const 該函數返回當前事件循環的層級,但是該函數只能在線程內部調用。
static void QThread::msleep(unsigned long msecs) 強制線程休息msecs毫秒
static void QThread::usleep(unsigned long usecs) 強制線程休息usecs微秒
static void QThread::sleep(unsigned long secs) 強制線程休息secs秒
virtual protected void QThread::run() 該函數是線程運行的起始點。調用start()函數之後,新創建的函數調用該函數,默認的QThread簡單的調用exec()進入事件循環機制。我們可以重載這個函數來實現更高級的線程管理方式。從該函數返回將結束線程。
static void QThread::setPriority(Priority priority)  該函數設置線程運行的優先級,如果線程並沒有處於運行狀態,該函數什麼也不做。可以通過調用start()來指定一個優先級來啓動線程。優先級的效果依賴於操作系統的調度方式,尤其是在不支持優先級的操作系統上,優先級設置會被忽略。
slot void QThread::quit() 告訴線程的事件循環退出並且返回0值,相當於調用QThread::exit(0)。如果線程沒有事件循環,這個函數則什麼也不做。
virtual protected void QThread::setStackSize(uint stackSize) 設置線程堆棧的最大值,如果設置的值大於0,那麼就會將堆棧最大值設置爲當前數值。否則,線程堆棧的最大值由操作系統來決定。警告:大部分操作系統都會自己設置線程堆棧的最大最小值,如果設置的堆棧大小超出範圍,線程則不能啓動。
static protected void QThread::setTerminationEnabled(bool enabled = true)  
slot void QThread::start(Priority priority = InheritPriority) 通過調用run()函數啓動線程。操作系統會根據優先級來調度線程。如果線程已經處於運行狀態,該函數什麼也不做。優先級設置依賴於操作系統的線程調度方式。
signal void QThread::started()  線程開始執行時發出該信號,發出時間在run()函數調用之前。注意:這是一個私有信號,因此只能由線程發出,用戶不能發出該信號。
slot void QThread::terminate()

 終止當前線程。線程或許不會立即被終止,依賴於線程的調度策略。一般情況下,調用該函數之後再調用QThread::wait()來確保線程結束。該線程終止後,等待該線程的其他線程將被喚醒。警告:該函數比較危險,不推薦這樣做。線程可能在任何代碼處終止。或許在修改數據時被終止,線程結束後自己不能去做清理工作。

static bool QThread::wait(unsigned long time = ULONG_MAX)

阻塞當前的進程,直到滿足如下兩個條件之一: 1.相關的線程完成其任務,然後如果線程已經結束,則該函數返回true,如果線程沒有啓動,則該函數也會返回true。 2. 經過了特定長度的時間,如果時間是ULONG_MAX(默認值),那麼wait()函數幾乎不會超時。(即該函數必須從run()函數返回)如果wait函數超時,那麼該函數會返回false。

static void QThread::yieldCurrentThread() 將當前線程的執行權讓給別的可執行線程。至於讓給哪一個可執行線程,那就是操作系統的事情了。

 

 

使用技巧:
一般調用quit()函數之後可以緊接着調用wait()函數確保線程退出。
sleep()等讓線程休眠的函數不需要調用,因爲Qt中線程是事件驅動機制。但是如果是繼承的QTHread類,在run()函數中使用了無限循環的方式,可以考慮msleep()函數來使線程休息一段時間,一般爲1毫秒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章