1. 程式人生 > >QThread必須要了解的幾個函式

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::msleep(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() 將當前執行緒的執行權讓給別的可執行執行緒。至於讓給哪一個可執行執行緒,那就是作業系統的事情了。

使用技巧

  1. 一般呼叫quit()函式之後可以緊接著呼叫wait()函式確保執行緒退出。
  2. sleep()等讓執行緒休眠的函式不需要呼叫,因為Qt中執行緒是事件驅動機制。但是如果是繼承的QTHread類,在run()函式中使用了無限迴圈的方式,可以考慮msleep()函式來使執行緒休息一段時間,一般為1毫秒。