QRunnable類 API
1)在Qt中使用線程池需要先創建任務,添加到線程池中的每一個任務都需要是一個 QRunnable 類型,因此在程序中需要創建子類繼承 QRunnable 這個類。
2)然后重寫 run() 方法,在這個函數中編寫要在線程池中執行的任務。
3)并將這個子類對象傳遞給線程池,這樣任務就可以被線程池中的某個工作的線程處理掉了。
// 在子類中必須要重寫的函數, 里邊是任務的處理流程
[pure virtual] void QRunnable::run();void QRunnable::setAutoDelete(bool autoDelete);
// 參數設置為 true: 這個任務對象在線程池中的線程中處理完畢, 這個任務對象就會自動銷毀
// 參數設置為 false: 這個任務對象在線程池中的線程中處理完畢, 對象需要程序猿手動銷毀// 獲取當前任務對象的析構方式,返回true->自動析構, 返回false->手動析構
bool QRunnable::autoDelete() const;
創建一個任務類
class MyWork : public QObject, public QRunnable
{Q_OBJECT
public:explicit MyWork(QObject *parent = nullptr){setAutoDelete(true); // 任務執行完畢,該對象自動銷毀}~MyWork();void run() override{}
}
//MyWork類是一個多重繼承,如果需要在這個任務中使用Qt的信號槽機制進行數據的傳遞就必須繼承QObject這個類,否者不用。
QThreadPool 類 API
1)每個Qt應用程序都有一個全局 QThreadPool 對象,可以通過調用 globalInstance() 來訪問它。
2)也可以單獨創建一個 QThreadPool 對象使用。
// 獲取和設置線程中的最大線程個數
int maxThreadCount() const;
void setMaxThreadCount(int maxThreadCount);// 給線程池添加任務, 任務是一個 QRunnable 類型的對象
// 如果線程池中沒有空閑的線程了, 任務會放到任務隊列中, 等待線程處理
void QThreadPool::start(QRunnable * runnable, int priority = 0);// 如果線程池中沒有空閑的線程了, 直接返回值, 任務添加失敗, 任務不會添加到任務隊列中
bool QThreadPool::tryStart(QRunnable * runnable);// 線程池中被激活的線程的個數(正在工作的線程個數)
int QThreadPool::activeThreadCount() const;// 嘗試性的將某一個任務從線程池的任務隊列中刪除, 如果任務已經開始執行就無法刪除了
bool QThreadPool::tryTake(QRunnable *runnable);// 將線程池中的任務隊列里邊沒有開始處理的所有任務刪除, 如果已經開始處理了就無法通過該函數刪除了
void QThreadPool::clear();// 在每個Qt應用程序中都有一個全局的線程池對象, 通過這個函數直接訪問這個對象
static QThreadPool * QThreadPool::globalInstance();
1)一般情況,不需要在Qt程序中創建線程池對象,直接使用Qt為每個應用程序提供的線程池全局對象即可。
2)得到線程池對象之后,調用**start()**方法就可以將一個任務添加到線程池中。
案列
//mywork.hclass MyWork :public QRunnable{Q_OBJECTpublic:explicit MyWork();~MyWork();void run() override;}
//mywork.cppMyWork::MyWork() : QRunnable(){// 任務執行完畢,該對象自動銷毀setAutoDelete(true);}void MyWork::run(){// 業務處理代碼......}
//mainwindow.cpp// 線程池初始化,設置最大線程池數QThreadPool::globalInstance()->setMaxThreadCount(4);// 添加任務MyWork *task = new MyWork;QThreadPool::globalInstance()->start(task);
詳細教程可轉
愛編程的大丙