Qt 中線(xiàn)程池QRunnable和QThreadPool的使用
一、QThreadPool類(lèi)介紹
QThreadPool 是 Qt 框架中用于管理線(xiàn)程池的類(lèi),它提供了一種高效的方式來(lái)管理和復(fù)用線(xiàn)程,避免頻繁創(chuàng)建和銷(xiāo)毀線(xiàn)程帶來(lái)的開(kāi)銷(xiāo)。
1.基本概念
QThreadPool 是一個(gè)全局的線(xiàn)程池,它維護(hù)了一組線(xiàn)程,并將任務(wù)分配給這些線(xiàn)程執(zhí)行。線(xiàn)程池中的線(xiàn)程數(shù)量可以通過(guò)設(shè)置最大線(xiàn)程數(shù)來(lái)控制。當(dāng)線(xiàn)程池中的線(xiàn)程被占用時(shí),新任務(wù)會(huì)被排隊(duì)等待執(zhí)行。
2.創(chuàng)建和使用線(xiàn)程池
Qt 提供了一個(gè)全局線(xiàn)程池 QThreadPool::globalInstance(),可以直接使用,也可以創(chuàng)建自己的線(xiàn)程池實(shí)例。
全局線(xiàn)程池的使用:
// 獲取全局線(xiàn)程池 QThreadPool *threadPool = QThreadPool::globalInstance(); // 設(shè)置最大線(xiàn)程數(shù)(可選) threadPool->setMaxThreadCount(4);
自定義線(xiàn)程池的使用:
QThreadPool *myThreadPool = new QThreadPool(); myThreadPool->setMaxThreadCount(8); // 設(shè)置最大線(xiàn)程數(shù)
3.關(guān)鍵方法
以下是 QThreadPool 的一些常用方法:
(1) 設(shè)置線(xiàn)程池的最大線(xiàn)程數(shù)
void QThreadPool::setMaxThreadCount(int maxThreadCount);
用于設(shè)置線(xiàn)程池中允許的最大線(xiàn)程數(shù)。默認(rèn)值通常是系統(tǒng)核心數(shù)的兩倍。
(2) 啟動(dòng)任務(wù)
void QThreadPool::start(QRunnable *runnable);
將一個(gè) QRunnable 對(duì)象提交到線(xiàn)程池中執(zhí)行。
(3) 等待所有任務(wù)完成
void QThreadPool::waitForDone();
阻塞當(dāng)前線(xiàn)程,直到線(xiàn)程池中的所有任務(wù)都完成。
(4) 獲取全局線(xiàn)程池
static QThreadPool *QThreadPool::globalInstance();
返回全局線(xiàn)程池實(shí)例,通常用于共享程線(xiàn)池。
4.注意事項(xiàng)
- 線(xiàn)程安全:
QThreadPool是線(xiàn)程安全的,可以在多個(gè)線(xiàn)程中同時(shí)調(diào)用其方法。 - 任務(wù)的生命周期:任務(wù)對(duì)象(
QRunnable的子類(lèi))通常由線(xiàn)程池管理,任務(wù)完成后會(huì)被自動(dòng)刪除。如果需要手動(dòng)管理任務(wù)對(duì)象的生命周期,可以在任務(wù)類(lèi)中重寫(xiě)autoDelete()方法。 - 任務(wù)隊(duì)列:當(dāng)線(xiàn)程池中的線(xiàn)程被占用時(shí),新任務(wù)會(huì)被放入隊(duì)列中等待執(zhí)行。
- 線(xiàn)程池的銷(xiāo)毀:當(dāng)線(xiàn)程池被銷(xiāo)毀時(shí),所有未完成的任務(wù)會(huì)被取消,線(xiàn)程池中的線(xiàn)程也會(huì)被銷(xiāo)毀。
二、QRunnable類(lèi)介紹
QRunnable 是 Qt 框架中用于表示可運(yùn)行任務(wù)的類(lèi),它是線(xiàn)程池(QThreadPool)中任務(wù)的接口。通過(guò)繼承 QRunnable 并重寫(xiě)其 run() 方法,可以創(chuàng)建一個(gè)可以在單獨(dú)線(xiàn)程中執(zhí)行的任務(wù)。QRunnable 是 Qt 實(shí)現(xiàn)線(xiàn)程池任務(wù)調(diào)度的核心機(jī)制之一。
1. QRunnable 的作用
QRunnable 是一個(gè)抽象類(lèi),用于表示一個(gè)可以被線(xiàn)程執(zhí)行的任務(wù)。它的主要目的是將任務(wù)封裝為一個(gè)對(duì)象,然后通過(guò)線(xiàn)程池(QThreadPool)或其他線(xiàn)程管理機(jī)制來(lái)執(zhí)行這些任務(wù)。QRunnable 的設(shè)計(jì)使得任務(wù)的創(chuàng)建和執(zhí)行解耦,從而提高了代碼的可維護(hù)性和可擴(kuò)展性。
2. QRunnable 的基本用法
要使用 QRunnable,通常需要執(zhí)行以下步驟:
1繼承 QRunnable:創(chuàng)建一個(gè)繼承自 QRunnable 的類(lèi)。
2.重寫(xiě) run() 方法:在 run() 方法中實(shí)現(xiàn)任務(wù)的邏輯。
3.提交任務(wù)到線(xiàn)程池:通過(guò) QThreadPool 的 start() 方法將任務(wù)提交到線(xiàn)程池中執(zhí)行。
3. QRunnable 的關(guān)鍵特性
(1) 自動(dòng)刪除
QRunnable 提供了一個(gè) autoDelete() 方法,用于控制任務(wù)對(duì)象在執(zhí)行完成后是否自動(dòng)刪除。默認(rèn)情況下,autoDelete() 返回 true,表示任務(wù)對(duì)象會(huì)在執(zhí)行完成后自動(dòng)刪除。如果需要手動(dòng)管理任務(wù)對(duì)象的生命周期,可以在任務(wù)類(lèi)中重寫(xiě) autoDelete() 方法。
bool QRunnable::autoDelete() const;
(2) 設(shè)置優(yōu)先級(jí)
QRunnable 允許設(shè)置任務(wù)的優(yōu)先級(jí),優(yōu)先級(jí)高的任務(wù)會(huì)優(yōu)先執(zhí)行。
void QRunnable::setAutoDelete(bool autoDelete); void QRunnable::setPriority(QThread::Priority priority);
(3) 線(xiàn)程安全
QRunnable 是線(xiàn)程安全的,可以在多個(gè)線(xiàn)程中同時(shí)創(chuàng)建和提交任務(wù)。
4. QRunnable 的應(yīng)用場(chǎng)景
QRunnable 適用于以下場(chǎng)景:
1.并發(fā)任務(wù):需要在多個(gè)線(xiàn)程中并發(fā)執(zhí)行任務(wù)時(shí),QRunnable 是一個(gè)很好的選擇。
2.線(xiàn)程池管理:通過(guò) QThreadPool 和 QRunnable,可以高效地管理線(xiàn)程池中的任務(wù),避免頻繁創(chuàng)建和銷(xiāo)毀線(xiàn)程。
3.簡(jiǎn)化線(xiàn)程管理:QRunnable 將任務(wù)封裝為對(duì)象,使得任務(wù)的創(chuàng)建和執(zhí)行更加清晰和易于管理。
5. QRunnable 和 QThread 的區(qū)別
雖然 QRunnable 和 QThread 都可以用于多線(xiàn)程編程,但它們的用途和設(shè)計(jì)目標(biāo)有所不同:
- QThread:
- 是一個(gè)完整的線(xiàn)程類(lèi),提供了對(duì)線(xiàn)程生命周期的精細(xì)控制。
- 適用于需要長(zhǎng)期運(yùn)行的線(xiàn)程,或者需要手動(dòng)管理線(xiàn)程生命周期的場(chǎng)景。
- 使用起來(lái)相對(duì)復(fù)雜,需要手動(dòng)啟動(dòng)和停止線(xiàn)程。
- QRunnable:
- 是一個(gè)任務(wù)類(lèi),用于表示一個(gè)可以在單獨(dú)線(xiàn)程中執(zhí)行的任務(wù)。
- 通常與 QThreadPool 配合使用,適用于短時(shí)間任務(wù)的并發(fā)執(zhí)行。
- 使用起來(lái)相對(duì)簡(jiǎn)單,任務(wù)完成后會(huì)自動(dòng)刪除。
三、使用示例
下面通過(guò)一個(gè)代碼示例來(lái)講述如何使用:
#include <QCoreApplication>
#include <QThreadPool>
#include <QRunnable>
#include <QThread>
#include <QDebug>
class QMyTask:public QRunnable
{
public:
QMyTask(int nID)
{
m_nID = nID;
}
~QMyTask(){};
virtual void run() override
{
qDebug() << "Task"<< m_nID << "Is Run On Thread" << QThread::currentThreadId();
QThread::sleep(2); // 模擬耗時(shí)任務(wù)
qDebug() << "Task" << m_nID << "finished";
}
private:
int m_nID;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QThreadPool* pThreadPool = QThreadPool::globalInstance();
pThreadPool->setMaxThreadCount(4);
for(int i=0;i<10;i++)
{
QMyTask* pTask = new QMyTask(i);
pThreadPool->start(pTask);
}
pThreadPool->waitForDone();
qDebug() << "All tasks are done.";
return a.exec();
}
代碼運(yùn)行結(jié)果:

四、總結(jié)
1.QThreadPool 提供了一種簡(jiǎn)單而高效的方式來(lái)管理線(xiàn)程,特別適合處理大量短時(shí)間任務(wù)的場(chǎng)景。通過(guò)合理設(shè)置線(xiàn)程池的大小和任務(wù)的管理方式,可以顯著提高程序的性能和響應(yīng)速度。
2.QRunnable 是 Qt 中用于表示可運(yùn)行任務(wù)的類(lèi),它通過(guò)線(xiàn)程池(QThreadPool)實(shí)現(xiàn)任務(wù)的并發(fā)執(zhí)行。通過(guò)繼承 QRunnable 并重寫(xiě) run() 方法,可以輕松創(chuàng)建和管理任務(wù)。QRunnable 的設(shè)計(jì)使得任務(wù)的創(chuàng)建和執(zhí)行解耦,提高了代碼的可維護(hù)性和可擴(kuò)展性。在需要并發(fā)執(zhí)行短時(shí)間任務(wù)時(shí),QRunnable 是一個(gè)非常高效的選擇。
到此這篇關(guān)于Qt 中線(xiàn)程池QRunnable和QThreadPool的使用的文章就介紹到這了,更多相關(guān)Qt QRunnable QThreadPool內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT自定義QTextEdit實(shí)現(xiàn)大數(shù)據(jù)的實(shí)時(shí)刷新顯示功能實(shí)例
TextEdit是我們常用的Qt控件,用來(lái)顯示文本信息,下面這篇文章主要給大家介紹了關(guān)于QT自定義QTextEdit實(shí)現(xiàn)大數(shù)據(jù)的實(shí)時(shí)刷新顯示功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
C語(yǔ)言數(shù)組實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)組實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Linux網(wǎng)絡(luò)編程之基于UDP實(shí)現(xiàn)可靠的文件傳輸示例
這篇文章主要介紹了Linux網(wǎng)絡(luò)編程之基于UDP實(shí)現(xiàn)可靠的文件傳輸示例,是很實(shí)用的技巧,需要的朋友可以參考下2014-08-08
C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
C語(yǔ)言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

