Auf dieser Seite

QThreadPool Class

Die Klasse „QThreadPool“ verwaltet eine Sammlung von QThreads. Mehr...

Header: #include <QThreadPool>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Erbt von: QObject

Hinweis: Alle Funktionen dieser Klasse sind threadsicher.

Eigenschaften

Öffentliche Funktionen

QThreadPool(QObject *parent = nullptr)
virtual ~QThreadPool()
int activeThreadCount() const
void clear()
(since 6.0) bool contains(const QThread *thread) const
int expiryTimeout() const
int maxThreadCount() const
void releaseThread()
void reserveThread()
(since 6.9) QThread::QualityOfService serviceLevel() const
void setExpiryTimeout(int expiryTimeout)
void setMaxThreadCount(int maxThreadCount)
(since 6.9) void setServiceLevel(QThread::QualityOfService serviceLevel)
void setStackSize(uint stackSize)
void setThreadPriority(QThread::Priority priority)
uint stackSize() const
void start(QRunnable *runnable, int priority = 0)
void start(Callable &&callableToRun, int priority = 0)
(since 6.3) void startOnReservedThread(QRunnable *runnable)
(since 6.3) void startOnReservedThread(Callable &&callableToRun)
QThread::Priority threadPriority() const
bool tryStart(QRunnable *runnable)
bool tryStart(Callable &&callableToRun)
bool tryTake(QRunnable *runnable)
(since 6.8) bool waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever)
bool waitForDone(int msecs)

Statische öffentliche Mitglieder

QThreadPool *globalInstance()

Ausführliche Beschreibung

QThreadPool verwaltet und recycelt einzelne ` QThread `-Objekte, um die Kosten für die Erstellung von Threads in Programmen, die Threads verwenden, zu reduzieren. Jede Qt-Anwendung verfügt über ein globales `QThreadPool`-Objekt, auf das durch den Aufruf von ` globalInstance()` zugegriffen werden kann.

Um einen der QThreadPool-Threads zu verwenden, erstellen Sie eine Unterklasse von ` QRunnable ` und implementieren Sie die virtuelle Funktion `run()`. Erstellen Sie anschließend ein Objekt dieser Klasse und übergeben Sie es an ` QThreadPool::start()`.

class HelloWorldTask : public QRunnable
{
    void run() override
    {
        qDebug() << "Hello world from thread" << QThread::currentThread();
    }
};

int main()
{
    //...
    HelloWorldTask *hello = new HelloWorldTask();
    // QThreadPool übernimmt die Verantwortung und löscht „hello“ automatisch
    QThreadPool::globalInstance()->start(hello);
    //...
}

QThreadPool löscht den QRunnable standardmäßig automatisch. Verwenden Sie ` QRunnable::setAutoDelete()`, um das Flag für die automatische Löschung zu ändern.

QThreadPool unterstützt die mehrmalige Ausführung desselben „ QRunnable “ durch den Aufruf von „ tryStart(this)“ innerhalb von „ QRunnable::run()“. Ist „autoDelete“ aktiviert, wird der „ QRunnable “ gelöscht, sobald der letzte Thread die „run“-Funktion verlässt. Der mehrmalige Aufruf von „ start()“ mit demselben „ QRunnable “, wenn „autoDelete“ aktiviert ist, führt zu einer Race Condition und wird nicht empfohlen.

Threads, die eine bestimmte Zeit lang nicht verwendet werden, verfallen. Das Standard-Ablauf-Timeout beträgt 30.000 Millisekunden (30 Sekunden). Dies kann mit ` setExpiryTimeout()` geändert werden. Die Einstellung eines negativen Ablauf-Timeouts deaktiviert den Ablaufmechanismus.

Rufen Sie „ maxThreadCount()“ auf, um die maximale Anzahl der zu verwendenden Threads abzufragen. Bei Bedarf können Sie das Limit mit „ setMaxThreadCount()“ ändern. Der Standardwert für „ maxThreadCount()“ ist „ QThread::idealThreadCount()“. Die Funktion „ activeThreadCount()“ gibt die Anzahl der Threads zurück, die derzeit aktiv sind.

Die Funktion „ reserveThread()“ reserviert einen Thread für die externe Nutzung. Verwenden Sie „ releaseThread()“, wenn Sie den Thread nicht mehr benötigen, damit er wiederverwendet werden kann. Im Wesentlichen erhöhen oder verringern diese Funktionen vorübergehend die Anzahl der aktiven Threads und sind nützlich bei der Implementierung zeitaufwändiger Operationen, die für den QThreadPool nicht sichtbar sind.

Beachten Sie, dass QThreadPool eine Low-Level-Klasse zur Verwaltung von Threads ist; Alternativen auf höherer Ebene finden Sie im Modul „ Qt Concurrent “.

Siehe auch „ QRunnable “.

Dokumentation zu den Eigenschaften

[read-only] activeThreadCount : int

Diese Eigenschaft gibt die Anzahl der aktiven Threads im Thread-Pool an.

Hinweis: Es ist möglich, dass diese Funktion einen Wert zurückgibt, der größer als ` maxThreadCount()` ist. Weitere Details finden Sie unter ` reserveThread()`.

Zugriffsfunktionen:

int activeThreadCount() const

Siehe auch reserveThread() und releaseThread().

expiryTimeout : int

Diese Eigenschaft enthält den Zeitüberschreitungswert für den Ablauf eines Threads in Millisekunden.

Threads, die für die Dauer von „expiryTimeout“ Millisekunden ungenutzt bleiben, gelten als abgelaufen und werden beendet. Solche Threads werden bei Bedarf neu gestartet. Der Standardwert für „ expiryTimeout “ beträgt 30.000 Millisekunden (30 Sekunden). Ist „ expiryTimeout “ negativ, verfallen neu erstellte Threads nicht, d. h., sie werden erst beendet, wenn der Thread-Pool aufgelöst wird.

Beachten Sie, dass die Einstellung von ` expiryTimeout ` keine Auswirkungen auf bereits laufende Threads hat. Nur neu erstellte Threads verwenden den neuen ` expiryTimeout`. Wir empfehlen, ` expiryTimeout ` unmittelbar nach der Erstellung des Thread-Pools, jedoch vor dem Aufruf von ` start()` festzulegen.

Zugriffsfunktionen:

int expiryTimeout() const
void setExpiryTimeout(int expiryTimeout)

maxThreadCount : int

Diese Eigenschaft gibt die maximale Anzahl der vom Thread-Pool verwendeten Threads an. Standardmäßig wird für diese Eigenschaft der Wert von ` QThread::idealThreadCount()` zum Zeitpunkt der Erstellung des ` QThreadPool `-Objekts verwendet.

Hinweis: Der Thread-Pool verwendet immer mindestens einen Thread, auch wenn der Wert von ` maxThreadCount ` null oder negativ ist.

Der Standardwert für ` maxThreadCount ` ist ` QThread::idealThreadCount()`.

Zugriffsfunktionen:

int maxThreadCount() const
void setMaxThreadCount(int maxThreadCount)

stackSize : uint

Diese Eigenschaft enthält die Stackgröße für die Worker-Threads des Thread-Pools.

Der Wert dieser Eigenschaft wird nur verwendet, wenn der Thread-Pool neue Threads erstellt. Eine Änderung hat keine Auswirkungen auf bereits erstellte oder laufende Threads.

Der Standardwert ist 0, wodurch „ QThread “ die vom Betriebssystem vorgegebene Standard-Stapelgröße verwendet.

Zugriffsfunktionen:

uint stackSize() const
void setStackSize(uint stackSize)

[since 6.2] threadPriority : QThread::Priority

Diese Eigenschaft enthält die Thread-Priorität für neue Worker-Threads.

Der Wert der Eigenschaft wird nur verwendet, wenn der Thread-Pool neue Threads startet. Eine Änderung hat keine Auswirkungen auf bereits laufende Threads.

Der Standardwert ist „ QThread::InheritPriority “, wodurch „ QThread “ dieselbe Priorität verwendet wie das „ QThreadPool “-Objekt, in dem es sich befindet.

Diese Aufzählung wurde in Qt 6.2 eingeführt.

Zugriffsfunktionen:

QThread::Priority threadPriority() const
void setThreadPriority(QThread::Priority priority)

Siehe auch ` QThread::Priority`.

Dokumentation zu den Mitgliedsfunktionen

QThreadPool::QThreadPool(QObject *parent = nullptr)

Erstellt einen Thread-Pool mit dem angegebenen ` parent`.

[virtual noexcept] QThreadPool::~QThreadPool()

Löst die „ QThreadPool “ auf. Diese Funktion bleibt blockiert, bis alle „Runnables“ abgeschlossen sind.

void QThreadPool::clear()

Entfernt die noch nicht gestarteten „Runnables“ aus der Warteschlange. Die „Runnables“, für die runnable->autoDelete() den Wert „ true “ zurückgibt, werden gelöscht.

Siehe auch ` start()`.

[since 6.0] bool QThreadPool::contains(const QThread *thread) const

Gibt „ true “ zurück, wenn „ thread “ ein Thread ist, der von diesem Thread-Pool verwaltet wird.

Diese Funktion wurde in Qt 6.0 eingeführt.

[static] QThreadPool *QThreadPool::globalInstance()

Gibt die globale Instanz von „ QThreadPool “ zurück.

void QThreadPool::releaseThread()

Gibt einen Thread frei, der zuvor durch einen Aufruf von „ reserveThread()“ reserviert wurde.

Hinweis: Der Aufruf dieser Funktion ohne vorherige Reservierung eines Threads erhöht vorübergehend den Wert von ` maxThreadCount()`. Dies ist nützlich, wenn ein Thread in den Ruhezustand wechselt, um auf weitere Aufgaben zu warten, sodass andere Threads weiterarbeiten können. Stellen Sie sicher, dass Sie ` reserveThread()` aufrufen, sobald das Warten beendet ist, damit der Thread-Pool den Wert von ` activeThreadCount()` korrekt aufrechterhalten kann.

Siehe auch ` reserveThread()`.

void QThreadPool::reserveThread()

Reserviert einen Thread, wobei „ activeThreadCount()“ und „ maxThreadCount()“ ignoriert werden.

Sobald Sie mit dem Thread fertig sind, rufen Sie ` releaseThread()` auf, damit er wiederverwendet werden kann.

Hinweis: Selbst wenn Sie mit ` maxThreadCount()` einen oder mehrere Threads reservieren, lässt der Thread-Pool weiterhin mindestens einen Thread zu.

Hinweis: Diese Funktion erhöht die gemeldete Anzahl aktiver Threads. Das bedeutet, dass bei Verwendung dieser Funktion der Wert von ` activeThreadCount()` größer sein kann als der von ` maxThreadCount()`.

Siehe auch ` releaseThread()`.

[since 6.9] QThread::QualityOfService QThreadPool::serviceLevel() const

Gibt die aktuelle Quality-of-Service-Stufe des Threads zurück.

Diese Funktion wurde in Qt 6.9 eingeführt.

Siehe auch „ setServiceLevel()“ und „ QThread::serviceLevel()“.

[since 6.9] void QThreadPool::setServiceLevel(QThread::QualityOfService serviceLevel)

Setzt die Quality-of-Service-Stufe von Thread-Objekten, die nach dem Aufruf dieses Setters erstellt werden, auf „ serviceLevel “.

Die Unterstützung ist nicht auf jeder Plattform verfügbar. Weitere Informationen finden Sie unter QThread::setServiceLevel().

Diese Funktion wurde in Qt 6.9 eingeführt.

Siehe auch „ serviceLevel()“ und „ QThread::serviceLevel()“.

void QThreadPool::start(QRunnable *runnable, int priority = 0)

Reserviert einen Thread und verwendet diesen zur Ausführung von ` runnable`, es sei denn, durch diesen Thread würde die aktuelle Thread-Anzahl den Wert von ` maxThreadCount()` überschreiten. In diesem Fall wird ` runnable ` stattdessen in eine Ausführungswarteschlange gestellt. Mit dem Argument ` priority ` lässt sich die Ausführungsreihenfolge in der Warteschlange steuern.

Beachten Sie, dass der Thread-Pool die Eigentumsrechte an „ runnable “ übernimmt, wenn „ runnable->autoDelete()“ „ true “ zurückgibt, und dass „ runnable “ nach der Rückkehr von „ runnable->run()“ automatisch vom Thread-Pool gelöscht wird. Wenn „ runnable->autoDelete()“ „ false “ zurückgibt, verbleiben die Eigentumsrechte an „ runnable “ beim Aufrufer. Beachten Sie, dass eine Änderung der automatischen Löschung unter „ runnable “ nach dem Aufruf dieser Funktionen zu undefiniertem Verhalten führt.

template <typename Callable> requires QRunnable::if_callable<Callable> void QThreadPool::start(Callable &&callableToRun, int priority = 0)

Reserviert einen Thread und verwendet ihn zur Ausführung von ` callableToRun`, es sei denn, durch diesen Thread würde die aktuelle Thread-Anzahl den Wert von ` maxThreadCount()` überschreiten. In diesem Fall wird ` callableToRun ` stattdessen einer Ausführungswarteschlange hinzugefügt. Mit dem Argument ` priority ` lässt sich die Ausführungsreihenfolge in der Ausführungswarteschlange steuern.

Hinweis: In Qt-Versionen vor 6.6 nahm diese Funktion std::function<void()> entgegen und konnte daher keine „Move-only“-Callables verarbeiten.

Einschränkungen

Nimmt nur dann an der Überladungsauflösung teil, wenn ` Callable ` eine Funktion oder ein Funktionsobjekt ist, das mit null Argumenten aufgerufen werden kann.

Dies ist eine überladene Funktion.

[since 6.3] void QThreadPool::startOnReservedThread(QRunnable *runnable)

Gibt einen zuvor mit ` reserveThread()` reservierten Thread frei und verwendet ihn zur Ausführung von ` runnable`.

Beachten Sie, dass der Thread-Pool die Eigentumsrechte an ` runnable ` übernimmt, wenn ` runnable->autoDelete()` den Wert ` true` zurückgibt, und dass ` runnable ` nach der Rückkehr von ` runnable->run()` automatisch vom Thread-Pool gelöscht wird. Wenn ` runnable->autoDelete()` den Wert ` false` zurückgibt, verbleibt das Eigentumsrecht an ` runnable ` beim Aufrufer. Beachten Sie, dass eine Änderung der automatischen Löschung unter ` runnable ` nach dem Aufruf dieser Funktionen zu undefiniertem Verhalten führt.

Hinweis: Der Aufruf dieser Funktion, wenn keine Threads reserviert sind, führt zu undefiniertem Verhalten.

Diese Funktion wurde in Qt 6.3 eingeführt.

Siehe auch „ reserveThread()“ und „ start()“.

[since 6.3] template <typename Callable> requires QRunnable::if_callable<Callable> void QThreadPool::startOnReservedThread(Callable &&callableToRun)

Gibt einen zuvor mit ` reserveThread()` reservierten Thread frei und verwendet ihn zur Ausführung von ` callableToRun`.

Hinweis: In Qt-Versionen vor 6.6 nahm diese Funktion `std::function<void()>` entgegen und konnte daher keine „Move-only“-Callables verarbeiten.

Einschränkungen

Nimmt nur dann an der Überladungsauflösung teil, wenn ` Callable ` eine Funktion oder ein Funktionsobjekt ist, das ohne Argumente aufgerufen werden kann.

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.3 eingeführt.

bool QThreadPool::tryStart(QRunnable *runnable)

Versucht, einen Thread für die Ausführung von ` runnable` zu reservieren.

Sind zum Zeitpunkt des Aufrufs keine Threads verfügbar, führt diese Funktion keine Aktion aus und gibt „ false “ zurück. Andernfalls wird „ runnable “ sofort unter Verwendung eines verfügbaren Threads ausgeführt, und diese Funktion gibt „ true “ zurück.

Beachten Sie, dass bei Erfolg der Thread-Pool die Verantwortung für ` runnable ` übernimmt, wenn ` runnable->autoDelete()` ` true` zurückgibt, und dass ` runnable ` vom Thread-Pool automatisch gelöscht wird, nachdem ` runnable->run()` zurückgekehrt ist. Wenn ` runnable->autoDelete()` ` false` zurückgibt, verbleibt die Verantwortung für ` runnable ` beim Aufrufer. Beachten Sie, dass eine Änderung der automatischen Löschung unter ` runnable ` nach dem Aufruf dieser Funktion zu undefiniertem Verhalten führt.

template <typename Callable> requires QRunnable::if_callable<Callable> bool QThreadPool::tryStart(Callable &&callableToRun)

Versucht, einen Thread für die Ausführung von „ callableToRun “ zu reservieren.

Sind zum Zeitpunkt des Aufrufs keine Threads verfügbar, führt diese Funktion keine Aktion aus und gibt „ false “ zurück. Andernfalls wird „ callableToRun “ sofort unter Verwendung eines verfügbaren Threads ausgeführt, und diese Funktion gibt „ true “ zurück.

Hinweis: In Qt-Versionen vor 6.6 nahm diese Funktion `std::function<void()>` entgegen und konnte daher keine Move-only-Callables verarbeiten.

Einschränkungen

Nimmt nur dann an der Überladungsauflösung teil, wenn „ Callable “ eine Funktion oder ein Funktionsobjekt ist, das ohne Argumente aufgerufen werden kann.

Dies ist eine überladene Funktion.

bool QThreadPool::tryTake(QRunnable *runnable)

Versucht, das angegebene „ runnable “ aus der Warteschlange zu entfernen, sofern es noch nicht gestartet wurde. Wenn das „runnable“ noch nicht gestartet wurde, wird „ true “ zurückgegeben, und die Eigentumsrechte an „ runnable “ werden auf den Aufrufer übertragen (auch wenn „ runnable->autoDelete() == true “ gilt). Andernfalls wird „ false “ zurückgegeben.

Hinweis: Wenn „ runnable->autoDelete() == true “gilt , entfernt diese Funktion möglicherweise das falsche „Runnable“. Dies wird als ABA-Problem bezeichnet: Das ursprüngliche „ runnable “ wurde möglicherweise bereits ausgeführt und anschließend gelöscht. Der Speicher wird für ein anderes „Runnable“ wiederverwendet, das dann anstelle des beabsichtigten entfernt wird. Aus diesem Grund empfehlen wir, diese Funktion nur für „runnables“ aufzurufen, die nicht automatisch gelöscht werden.

Siehe auch „ start()“ und „ QRunnable::autoDelete()“.

[since 6.8] bool QThreadPool::waitForDone(QDeadlineTimer deadline = QDeadlineTimer::Forever)

Wartet, bis „ deadline “ abgelaufen ist, damit alle Threads beendet werden, und entfernt alle Threads aus dem Thread-Pool. Gibt „ true “ zurück, wenn alle Threads entfernt wurden; andernfalls wird „ false “ zurückgegeben.

Diese Funktion wurde in Qt 6.8 eingeführt.

bool QThreadPool::waitForDone(int msecs)

Wartet bis zu msecs Millisekunden, bis alle Threads beendet sind, und entfernt alle Threads aus dem Thread-Pool. Gibt „ true “ zurück, wenn alle Threads entfernt wurden; andernfalls wird „ false “ zurückgegeben. Wenn „ msecs “ den Wert -1 hat, wartet diese Funktion, bis der letzte Thread beendet ist.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.