QThread Class
Die Klasse `QThread` bietet eine plattformunabhängige Möglichkeit zur Verwaltung von Threads. Mehr...
| Header: | #include <QThread> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Erbt von: | QObject |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QThread ist Teil der Threading-Klassen.
Öffentliche Typen
| enum | Priority { IdlePriority, LowestPriority, LowPriority, NormalPriority, HighPriority, …, InheritPriority } |
(since 6.9) enum class | QualityOfService { Auto, High, Eco } |
Öffentliche Funktionen
| QThread(QObject *parent = nullptr) | |
| virtual | ~QThread() |
| QAbstractEventDispatcher * | eventDispatcher() const |
(since 6.8) bool | isCurrentThread() const |
| bool | isFinished() const |
| bool | isInterruptionRequested() const |
| bool | isRunning() const |
| int | loopLevel() const |
| QThread::Priority | priority() const |
| void | requestInterruption() |
(since 6.9) QThread::QualityOfService | serviceLevel() const |
| void | setEventDispatcher(QAbstractEventDispatcher *eventDispatcher) |
| void | setPriority(QThread::Priority priority) |
(since 6.9) void | setServiceLevel(QThread::QualityOfService serviceLevel) |
| void | setStackSize(uint stackSize) |
| uint | stackSize() const |
| bool | wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever)) |
| bool | wait(unsigned long time) |
Neu implementierte öffentliche Funktionen
| virtual bool | event(QEvent *event) override |
Öffentliche Slots
| void | exit(int returnCode = 0) |
| void | quit() |
| void | start(QThread::Priority priority = InheritPriority) |
| void | terminate() |
Signale
Statische öffentliche Mitglieder
| QThread * | create(Function &&f, Args &&... args) |
| QThread * | currentThread() |
| Qt::HANDLE | currentThreadId() |
| int | idealThreadCount() |
(since 6.8) bool | isMainThread() |
| void | msleep(unsigned long msecs) |
(since 6.6) void | sleep(std::chrono::nanoseconds nsecs) |
| void | sleep(unsigned long secs) |
| void | usleep(unsigned long usecs) |
| void | yieldCurrentThread() |
Geschützte Funktionen
Statische geschützte Mitglieder
| void | setTerminationEnabled(bool enabled = true) |
Ausführliche Beschreibung
Ein QThread-Objekt verwaltet einen Kontroll-Thread innerhalb des Programms. QThreads beginnen ihre Ausführung in ` run()`. Standardmäßig startet ` run()` die Ereignisschleife durch Aufruf von ` exec()` und führt eine Qt-Ereignisschleife innerhalb des Threads aus.
Sie können Worker-Objekte verwenden, indem Sie sie mit ` QObject::moveToThread()` in den Thread verschieben.
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork(const QString ¶meter) {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(this, &Controller::operate, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, this, &Controller::handleResults);
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};Der Code innerhalb des Slots des Workers würde dann in einem separaten Thread ausgeführt werden. Es steht Ihnen jedoch frei, die Slots des Workers mit jedem Signal von jedem beliebigen Objekt in jedem beliebigen Thread zu verbinden. Dank eines Mechanismus namens „ queued connections “ ist es sicher, Signale und Slots über verschiedene Threads hinweg zu verbinden.
Eine weitere Möglichkeit, Code in einem separaten Thread ausführen zu lassen, besteht darin, eine Unterklasse von `QThread` zu erstellen und ` run()` neu zu implementieren. Zum Beispiel:
class WorkerThread : public QThread
{
Q_OBJECT
public:
explicit WorkerThread(QObject *parent = nullptr) : QThread(parent) { }
protected:
void run() override {
QString result;
/* ... here is the expensive or blocking operation ... */
emit resultReady(result);
}
signals:
void resultReady(const QString &s);
};
void MyObject::startWorkInAThread()
{
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
workerThread->start();
}In diesem Beispiel wird der Thread beendet, sobald die Funktion `run` zurückgekehrt ist. In dem Thread läuft keine Ereignisschleife, es sei denn, Sie rufen ` exec()` auf.
Es ist wichtig zu beachten, dass eine QThread-Instanz ` lives in ` im alten Thread ausführt, der sie instanziiert hat, und nicht in dem neuen Thread, der ` run()` aufruft. Das bedeutet, dass alle in der Warteschlange befindlichen Slots und „ invoked methods “ von QThread im alten Thread ausgeführt werden. Daher muss ein Entwickler, der Slots im neuen Thread aufrufen möchte, den Worker-Objekt-Ansatz verwenden; neue Slots sollten nicht direkt in einer Unterklasse von QThread implementiert werden.
Im Gegensatz zu Slots in der Warteschlange oder aufgerufenen Methoden werden Methoden, die direkt am QThread-Objekt aufgerufen werden, in dem Thread ausgeführt, der die Methode aufruft. Beachten Sie beim Erstellen einer Unterklasse von QThread, dass der Konstruktor im alten Thread ausgeführt wird, während ` run()` im neuen Thread ausgeführt wird. Wird auf eine Member-Variable von beiden Funktionen aus zugegriffen, erfolgt der Zugriff auf die Variable aus zwei verschiedenen Threads. Stellen Sie sicher, dass dies unbedenklich ist.
Hinweis: Bei der Interaktion mit Objekten über verschiedene Threads hinweg istVorsicht geboten. Generell gilt, dass Funktionen nur aus dem Thread aufgerufen werden können, der das QThread-Objekt selbst erstellt hat (z. B. ` setPriority()`), sofern in der Dokumentation nichts anderes angegeben ist. Weitere Informationen finden Sie unter „Synchronisierung von Threads “.
Verwaltung von Threads
QThread benachrichtigt Sie über ein Signal, wenn der Thread „ started()“ und „ finished()“ ist, oder Sie können mit „ isFinished()“ und „ isRunning()“ den Status des Threads abfragen.
Sie können den Thread durch Aufruf von ` exit()` oder ` quit()` stoppen. In Extremfällen möchten Sie möglicherweise einen laufenden Thread zwangsweise mit ` terminate()` beenden. Dies ist jedoch gefährlich und wird nicht empfohlen. Bitte lesen Sie die Dokumentation zu ` terminate()` und ` setTerminationEnabled()` für detaillierte Informationen.
Häufig möchten Sie Objekte, die in einem Thread vorhanden sind, freigeben, wenn dieser Thread endet. Verbinden Sie dazu das Signal „ finished()“ mit „ QObject::deleteLater()“.
Verwenden Sie ` wait()`, um den aufrufenden Thread zu blockieren, bis der andere Thread die Ausführung beendet hat (oder bis eine angegebene Zeit verstrichen ist).
QThread bietet außerdem statische, plattformunabhängige Sleep-Funktionen: „ sleep()“, „ msleep()“ und „ usleep()“ ermöglichen eine Auflösung von jeweils einer ganzen Sekunde, einer Millisekunde bzw. einer Mikrosekunde.
Hinweis: Die Funktionen` wait()` und ` sleep()` sollten im Allgemeinen nicht erforderlich sein, da Qt ein ereignisgesteuertes Framework ist. Anstelle von ` wait()` sollten Sie in Betracht ziehen, auf das Signal ` finished()` zu warten. Anstelle der Funktionen ` sleep()` sollten Sie die Verwendung von ` QChronoTimer` in Betracht ziehen.
Die statischen Funktionen ` currentThreadId()` und ` currentThread()` geben Kennungen für den aktuell ausgeführten Thread zurück. Erstere gibt eine plattformspezifische ID für den Thread zurück; letztere gibt einen `QThread`-Zeiger zurück.
Um den Namen festzulegen, der Ihrem Thread zugewiesen wird (wie er beispielsweise unter Linux durch den Befehl ` ps -L ` identifiziert wird), können Sie vor dem Start des Threads die Funktion ` setObjectName()` aufrufen. Wenn Sie ` setObjectName()` nicht aufrufen, lautet der Name Ihres Threads der Klassenname des Laufzeit-Typs Ihres Thread-Objekts (beispielsweise ` "RenderThread" ` im Fall des Mandelbrot-Beispiels, da dies der Name der QThread-Unterklasse ist). Beachten Sie, dass dies derzeit bei Release-Builds unter Windows nicht verfügbar ist.
Siehe auch Multithreading in Qt, QThreadStorage, Synchronisierung von Threads, Mandelbrot, Produzent und Konsument mit Semaphoren sowie Produzent und Konsument mit Wartebedingungen.
Dokumentation zu Mitgliedstypen
enum QThread::Priority
Dieser Enum-Typ gibt an, wie das Betriebssystem neu erstellte Threads planen soll.
| Konstante | Wert | Beschreibung |
|---|---|---|
QThread::IdlePriority | 0 | Wird nur eingeplant, wenn keine anderen Threads ausgeführt werden. |
QThread::LowestPriority | 1 | Wird seltener eingeplant als „LowPriority“. |
QThread::LowPriority | 2 | Wird seltener eingeplant als „NormalPriority“. |
QThread::NormalPriority | 3 | Die Standardpriorität des Betriebssystems. |
QThread::HighPriority | 4 | Wird häufiger eingeplant als „NormalPriority“. |
QThread::HighestPriority | 5 | wird häufiger eingeplant als „HighPriority“. |
QThread::TimeCriticalPriority | 6 | wird so oft wie möglich eingeplant. |
QThread::InheritPriority | 7 | Verwendet dieselbe Priorität wie der erzeugende Thread. Dies ist die Standardeinstellung. |
[since 6.9] enum class QThread::QualityOfService
Diese Enumeration beschreibt das Dienstgüte-Niveau eines Threads und liefert dem Scheduler Informationen über die Art der Arbeit, die der Thread ausführt. Auf Plattformen mit unterschiedlichen CPU-Profilen oder mit der Möglichkeit, bestimmte Kerne einer CPU herunterzutakten, ermöglicht dies dem Scheduler, einen CPU-Kern mit geeigneten Leistungs- und Energieeigenschaften für den Thread auszuwählen oder zu konfigurieren.
| Konstante | Wert | Beschreibung |
|---|---|---|
QThread::QualityOfService::Auto | 0 | Der Standardwert, bei dem es dem Scheduler überlassen bleibt, zu entscheiden, auf welchem CPU-Kern der Thread ausgeführt wird. |
QThread::QualityOfService::High | 1 | Der Scheduler sollte diesen Thread auf einem leistungsstarken CPU-Kern ausführen. |
QThread::QualityOfService::Eco | 2 | Der Scheduler sollte diesen Thread auf einem energieeffizienten CPU-Kern ausführen. |
Diese Enumeration wurde in Qt 6.9 eingeführt.
Siehe auch „ Priority“ , „ serviceLevel()“ und „ QThreadPool::serviceLevel()“.
Dokumentation zu den Member-Funktionen
[explicit] QThread::QThread(QObject *parent = nullptr)
Erstellt einen neuen QThread zur Verwaltung eines neuen Threads. Der „ parent “ übernimmt die Verantwortung für den QThread. Der Thread beginnt erst mit der Ausführung, wenn „ start()“ aufgerufen wird.
Siehe auch ` start()`.
[virtual noexcept] QThread::~QThread()
Löscht das Objekt „ QThread “.
Beachten Sie, dass das Löschen eines „ QThread “-Objekts die Ausführung des von ihm verwalteten Threads nicht stoppt. Das Löschen eines laufenden „ QThread “ (d. h. „ isFinished()“ gibt „ false “ zurück) führt zu einem Programmabsturz. Warten Sie auf das Signal „ finished()“, bevor Sie den „ QThread “ löschen.
Seit Qt 6.3 ist es zulässig, eine durch einen Aufruf von ` QThread::create()` erstellte ` QThread `-Instanz zu löschen, selbst wenn der entsprechende Thread noch läuft. In einem solchen Fall sendet Qt eine Unterbrechungsanforderung an diesen Thread (über ` requestInterruption()`); fordert die Ereignisschleife des Threads (falls vorhanden) auf, zu beenden (über ` quit()`); und blockiert, bis der Thread beendet ist.
Siehe auch create(), isInterruptionRequested(), exec() und quit().
[static] template <typename Function, typename... Args> QThread *QThread::create(Function &&f, Args &&... args)
Erstellt ein neues „ QThread “-Objekt, das die Funktion „ f “ mit den Argumenten „ args “ ausführt.
Der neue Thread wird nicht gestartet – er muss durch einen expliziten Aufruf von ` start()` gestartet werden. Dies ermöglicht es Ihnen, sich an seine Signale anzuhängen, `QObjects` in den Thread zu verschieben, die Priorität des neuen Threads festzulegen und so weiter. Die Funktion ` f ` wird im neuen Thread aufgerufen.
Gibt die neu erstellte QThread -Instanz zurück.
Hinweis: Der Aufrufer erhält das Eigentumsrecht an der zurückgegebenen ` QThread `-Instanz.
Warnung: RufenSie ` start()` nicht mehr als einmal für die zurückgegebene ` QThread `-Instanzauf ; dies führt zu undefiniertem Verhalten.
Siehe auch „ start()“.
[static] QThread *QThread::currentThread()
Gibt einen Zeiger auf ein ` QThread ` zurück, das den aktuell ausgeführten Thread verwaltet.
[static noexcept] Qt::HANDLE QThread::currentThreadId()
Gibt das Thread-Handle des aktuell ausgeführten Threads zurück.
Warnung: Das von dieser Funktion zurückgegebene Handle dient internen Zwecken und sollte nicht im Anwendungscode verwendet werden.
Hinweis: Unter Windows gibt diese Funktion den DWORD-Wert (Windows-Thread-ID) zurück, der von der Win32-Funktion `GetCurrentThreadId()` zurückgegeben wird, und nicht das Pseudo-HANDLE (Windows-Thread-HANDLE), das von der Win32-Funktion `GetCurrentThread()` zurückgegeben wird.
[override virtual] bool QThread::event(QEvent *event)
Implementiert: ` QObject::event(QEvent *e)`.
QAbstractEventDispatcher *QThread::eventDispatcher() const
Gibt einen Zeiger auf das Ereignis-Dispatcher-Objekt für den Thread zurück. Wenn für den Thread kein Ereignis-Dispatcher vorhanden ist, gibt diese Funktion ` nullptr` zurück.
Siehe auch ` setEventDispatcher()`.
[protected] int QThread::exec()
Tritt in die Ereignisschleife ein und wartet, bis „ exit()“ aufgerufen wird, wobei der Wert zurückgegeben wird, der an „ exit()“ übergeben wurde. Der zurückgegebene Wert ist 0, wenn „ exit()“ über „ quit()“ aufgerufen wird.
Diese Funktion ist dafür vorgesehen, innerhalb von ` run()` aufgerufen zu werden. Der Aufruf dieser Funktion ist erforderlich, um die Ereignisbehandlung zu starten.
Hinweis: Diese Funktion kann nur innerhalb des Threads selbst aufgerufen werden, d. h. wenn es sich um den aktuellen Thread handelt.
Siehe auch „ quit()“ und „ exit()“.
[slot] void QThread::exit(int returnCode = 0)
Weist die Ereignisschleife des Threads an, mit einem Rückgabecode zu beenden.
Nach dem Aufruf dieser Funktion verlässt der Thread die Ereignisschleife und kehrt aus dem Aufruf von ` QEventLoop::exec()` zurück. Die Funktion ` QEventLoop::exec()` gibt ` returnCode` zurück.
Gemäß Konvention bedeutet ein ` returnCode ` von 0 Erfolg, jeder Wert ungleich Null weist auf einen Fehler hin.
Beachten Sie, dass diese Funktion – anders als die gleichnamige C-Bibliotheksfunktion – zum Aufrufer zurückkehrt; es ist die Ereignisverarbeitung, die beendet wird.
In diesem Thread werden keine QEventLoops mehr gestartet, bis QThread::exec() erneut aufgerufen wird. Wenn die Event-Loop in QThread::exec() nicht läuft, kehrt auch der nächste Aufruf von QThread::exec() sofort zurück.
Hinweis: Diese Funktion ist threadsicher.
Siehe auch quit() und QEventLoop.
[private signal] void QThread::finished()
Dieses Signal wird vom zugehörigen Thread unmittelbar vor Beendigung seiner Ausführung ausgesendet.
Wenn dieses Signal ausgesendet wird, ist die Ereignisschleife bereits angehalten. In diesem Thread werden keine weiteren Ereignisse mehr verarbeitet, mit Ausnahme von Ereignissen zum verzögerten Löschen. Dieses Signal kann mit ` QObject::deleteLater()` verknüpft werden, um Objekte in diesem Thread freizugeben.
Hinweis: Wenn der zugehörige Thread mit ` terminate()` beendet wurde, ist es nicht definiert, von welchem Thread aus dieses Signal ausgesendet wird.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, kann jedoch nicht vom Benutzer ausgelöst werden.
Siehe auch ` started()`.
[static noexcept] int QThread::idealThreadCount()
Gibt die ideale Anzahl von Threads zurück, die dieser Prozess parallel ausführen kann. Dazu wird die Anzahl der für diesen Prozess verfügbaren logischen Prozessoren (sofern vom Betriebssystem unterstützt) oder die Gesamtzahl der logischen Prozessoren im System abgefragt. Diese Funktion gibt 1 zurück, wenn keiner der beiden Werte ermittelt werden konnte.
Hinweis: Auf Betriebssystemen, die die Zuordnung eines Threads zu einer Teilmenge aller logischen Prozessoren unterstützen, kann sich der von dieser Funktion zurückgegebene Wert zwischen den einzelnen Threads und im Laufe der Zeit ändern.
Hinweis: Auf Betriebssystemen, die das „Hotplugging“ und „Hot-Unplugging“ von CPUs unterstützen, kann sich der von dieser Funktion zurückgegebene Wert ebenfalls im Laufe der Zeit ändern (beachten Sie dabei, dass CPUs per Software ein- und ausgeschaltet werden können, ohne dass eine physische Hardwareänderung erforderlich ist).
[noexcept, since 6.8] bool QThread::isCurrentThread() const
Gibt „true“ zurück, wenn dieser Thread „ QThread::currentThread “ ist.
Diese Funktion wurde in Qt 6.8 eingeführt.
Siehe auch ` currentThreadId()`.
bool QThread::isFinished() const
Gibt „ true “ zurück, wenn der Thread beendet ist; andernfalls wird „ false “ zurückgegeben.
Ein Thread gilt als beendet, wenn er von der Funktion ` run()` zurückgekehrt ist und das Signal ` finished()` ausgelöst wurde.
Beachten Sie, dass der Thread nach dem Auslösen des Signals „ finished()“ noch für eine beliebige Zeitspanne weiterlaufen kann, um Aufräumvorgänge wie die Ausführung der Destruktoren für „ thread_local “-Variablen durchzuführen. Um die Synchronisation mit allen Auswirkungen des Threads sicherzustellen, rufen Sie „ wait()“ auf und überprüfen Sie, ob der Rückgabewert „true“ ist.
Hinweis: Diese Funktion ist threadsicher.
Siehe auch ` isRunning()`.
bool QThread::isInterruptionRequested() const
Gibt „true“ zurück, wenn die in diesem Thread ausgeführte Aufgabe angehalten werden soll. Eine Unterbrechung kann mit ` requestInterruption()` angefordert werden.
Diese Funktion kann verwendet werden, um lang laufende Aufgaben sauber unterbrechbar zu machen. Es ist sicher, den von dieser Funktion zurückgegebenen Wert niemals zu überprüfen oder darauf zu reagieren; es ist jedoch ratsam, dies in lang laufenden Funktionen regelmäßig zu tun. Achten Sie darauf, die Funktion nicht zu oft aufzurufen, um den Overhead gering zu halten.
void long_task() {
forever {
if ( QThread::currentThread()->isInterruptionRequested() ) {
return;
}
}
}Hinweis: Diese Funktion kann nur innerhalb des Threads selbst aufgerufen werden, d. h. wenn es sich um den aktuellen Thread handelt.
Siehe auch currentThread() und requestInterruption().
[static noexcept, since 6.8] bool QThread::isMainThread()
Gibt zurück, ob der aktuell ausgeführte Thread der Hauptthread ist.
Der Hauptthread ist der Thread, in dem „ QCoreApplication “ erstellt wurde. Dies ist in der Regel der Thread, der die Funktion „ main() “ aufgerufen hat, muss aber nicht unbedingt der Fall sein. Es handelt sich um den Thread, der die GUI-Ereignisse verarbeitet und in dem grafische Objekte (QWindow, QWidget) erstellt werden können.
Diese Funktion wurde in Qt 6.8 eingeführt.
Siehe auch „ currentThread()“ und „ QCoreApplication::instance()“.
bool QThread::isRunning() const
Gibt „ true “ zurück, wenn der Thread läuft; andernfalls gibt die Funktion „ false “ zurück.
Ein Thread gilt als laufend, wenn „ QThread “ mit „ start()“ gestartet wurde, aber noch nicht beendet ist.
Beachten Sie, dass der Thread nach dem Auslösen des Signals „ finished()“ noch für eine beliebige Zeitspanne weiterlaufen kann, um Aufräumvorgänge wie die Ausführung der Destruktoren für „ thread_local “-Variablen durchzuführen. Um die Synchronisation mit allen Auswirkungen des Threads sicherzustellen, rufen Sie „ wait()“ auf und überprüfen Sie, ob die Funktion „true“ zurückgibt.
Hinweis: Diese Funktion ist threadsicher.
Siehe auch ` isFinished()`.
int QThread::loopLevel() const
Gibt die aktuelle Event-Loop-Ebene für den Thread zurück.
Hinweis: Diese Funktion kann nur innerhalb des Threads selbst aufgerufen werden, d. h. wenn es sich um den aktuellen Thread handelt.
[static] void QThread::msleep(unsigned long msecs)
Dies ist eine überladene Funktion, die dem Aufruf von
QThread::sleep(std::chrono::milliseconds{msecs});Hinweis: Diese Funktion garantiert keine Genauigkeit. Unter hoher Auslastung kann die Anwendung möglicherweise länger als msecs in den Ruhezustand wechseln. Einige Betriebssysteme runden msecs möglicherweise auf 10 ms oder 15 ms auf.
Siehe auch sleep() und usleep().
QThread::Priority QThread::priority() const
Gibt die Priorität eines laufenden Threads zurück. Wenn der Thread nicht läuft, gibt diese Funktion „ InheritPriority “ zurück.
Siehe auch „ Priority“ , „ setPriority()“ und „ start()“.
[slot] void QThread::quit()
Weist die Ereignisschleife des Threads an, mit dem Rückgabewert 0 (Erfolg) zu beenden. Dies entspricht dem Aufruf von ` QThread::exit(0)`.
Diese Funktion hat keine Auswirkung, wenn der Thread keine Ereignisschleife besitzt.
Hinweis: Diese Funktion ist threadsicher.
Siehe auch ` exit()` und ` QEventLoop`.
void QThread::requestInterruption()
Fordert die Unterbrechung des Threads an. Diese Anforderung hat lediglich empfehlenden Charakter, und es liegt im Ermessen des auf dem Thread ausgeführten Codes, zu entscheiden, ob und wie er auf eine solche Anforderung reagieren soll. Diese Funktion stoppt keine auf dem Thread laufende Ereignisschleife und beendet den Thread in keiner Weise.
Diese Funktion hat keine Auswirkungen auf den Hauptthread und führt keine Aktion aus, wenn der Thread derzeit nicht läuft.
Hinweis: Diese Funktion ist threadsicher.
Siehe auch ` isInterruptionRequested()`.
[virtual protected] void QThread::run()
Der Startpunkt für den Thread. Nach dem Aufruf von ` start()` ruft der neu erstellte Thread diese Funktion auf. Die Standardimplementierung ruft einfach ` exec()` auf.
Sie können diese Funktion neu implementieren, um eine erweiterte Thread-Verwaltung zu ermöglichen. Die Rückkehr aus dieser Methode beendet die Ausführung des Threads.
Siehe auch ` start()` und ` wait()`.
[since 6.9] QThread::QualityOfService QThread::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 „ QThreadPool::serviceLevel()“.
void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)
Legt den Ereignis-Dispatcher für den Thread auf „ eventDispatcher “ fest. Dies ist nur möglich, solange für den Thread noch kein Ereignis-Dispatcher installiert ist.
Ein Ereignis-Dispatcher wird automatisch für den Haupt-Thread erstellt, wenn „ QCoreApplication “ instanziiert wird, sowie bei „ start()“ für Hilfs-Threads.
Diese Methode übernimmt die Eigentümerschaft an dem Objekt.
Siehe auch ` eventDispatcher()`.
void QThread::setPriority(QThread::Priority priority)
Diese Funktion legt die Priorität „ priority “ für einen laufenden Thread fest. Wenn der Thread nicht läuft, führt diese Funktion keine Aktion aus und kehrt sofort zurück. Verwenden Sie „ start()“, um einen Thread mit einer bestimmten Priorität zu starten.
Das Argument „ priority “ kann einen beliebigen Wert aus der Enumeration „ QThread::Priority “ annehmen, mit Ausnahme von „ InheritPriority “.
Die Wirkung des Parameters „ priority “ hängt von der Scheduling-Richtlinie des Betriebssystems ab. Insbesondere wird „ priority “ auf Systemen ignoriert, die keine Thread-Prioritäten unterstützen (z. B. unter Linux; weitere Details finden Sie unter http://linux.die.net/man/2/sched_setscheduler).
Siehe auch „ Priority“ , „ priority()“ und „ start()“.
[since 6.9] void QThread::setServiceLevel(QThread::QualityOfService serviceLevel)
Setzen Sie die Quality-of-Service-Stufe des Thread-Objekts auf „ serviceLevel “. Dies kann nur vom Thread selbst oder vor dem Start des Threads aufgerufen werden!
Dies ist derzeit nur auf Apple-Plattformen und unter Windows implementiert. Der Funktionsaufruf wird auf anderen Plattformen zwar erfolgreich ausgeführt, hat dort derzeit jedoch keine Wirkung.
Diese Funktion wurde in Qt 6.9 eingeführt.
Siehe auch „ serviceLevel()“ und „ QThreadPool::setServiceLevel()“.
void QThread::setStackSize(uint stackSize)
Legt die Stackgröße für den Thread auf stackSize Bytes fest. Ist stackSize gleich Null, wählt das Betriebssystem oder die Laufzeitumgebung einen Standardwert aus. Andernfalls entspricht die Stackgröße des Threads dem angegebenen Wert (der dabei auf- oder abgerundet werden kann).
Auf den meisten Betriebssystemen ist die für den Stack zugewiesene Speichermenge anfangs kleiner als „ stackSize “ und wächst, während der Thread den Stack nutzt. Dieser Parameter legt die maximale Größe fest, auf die der Stack anwachsen darf (d. h., er legt die Größe des virtuellen Speicherbereichs fest, den der Stack belegen darf).
Diese Funktion kann nur vor dem Start des Threads aufgerufen werden.
Warnung: Die meisten Betriebssysteme legen Mindest- und Höchstgrenzen für die Größe des Thread-Stacks fest. Der Thread kann nicht gestartet werden, wenn die Stackgröße außerhalb dieser Grenzen liegt.
Siehe auch ` stackSize()`.
[static protected] void QThread::setTerminationEnabled(bool enabled = true)
Aktiviert oder deaktiviert die Beendigung des aktuellen Threads basierend auf dem Parameter „ enabled “. Der Thread muss mit „ QThread “ gestartet worden sein.
Wenn „ enabled “ auf „false“ gesetzt ist, ist die Beendigung deaktiviert. Zukünftige Aufrufe von „ QThread::terminate()“ kehren sofort und ohne Wirkung zurück. Stattdessen wird die Beendigung aufgeschoben, bis sie aktiviert wird.
Ist ` enabled ` auf `true` gesetzt, ist die Beendigung aktiviert. Zukünftige Aufrufe von ` QThread::terminate()` beenden den Thread wie gewohnt. Wurde die Beendigung aufgeschoben (d. h., ` QThread::terminate()` wurde bei deaktivierter Beendigung aufgerufen), beendet diese Funktion den aufrufenden Thread sofort. Beachten Sie, dass diese Funktion in diesem Fall nicht zurückkehrt.
Siehe auch ` terminate()`.
[static, since 6.6] void QThread::sleep(std::chrono::nanoseconds nsecs)
Zwingt den aktuellen Thread, für die Dauer von ` nsecs` in den Ruhezustand zu wechseln.
Vermeiden Sie die Verwendung dieser Funktion, wenn Sie auf die Änderung einer bestimmten Bedingung warten müssen. Verbinden Sie stattdessen einen Slot mit dem Signal, das die Änderung anzeigt, oder verwenden Sie einen Ereignishandler (siehe QObject::event()).
Hinweis: Diese Funktion garantiert keine Genauigkeit. Unter hoher Auslastung kann die Anwendung möglicherweise länger als nsecs in den Ruhezustand versetzt werden.
Diese Funktion wurde in Qt 6.6 eingeführt.
[static] void QThread::sleep(unsigned long secs)
Zwingt den aktuellen Thread, secs Sekunden lang zu ruhen.
Dies ist eine überladene Funktion, die dem Aufruf von
QThread::sleep(std::chrono::seconds{secs});Siehe auch ` msleep()` und ` usleep()`.
uint QThread::stackSize() const
Gibt die maximale Stackgröße für den Thread in Byte zurück (sofern diese mit ` setStackSize()` festgelegt wurde); andernfalls wird Null zurückgegeben.
Siehe auch ` setStackSize()`.
[slot] void QThread::start(QThread::Priority priority = InheritPriority)
Leitet die Ausführung des Threads durch Aufruf von ` run()` ein. Das Betriebssystem plant den Thread entsprechend dem Parameter ` priority ` ein. Wenn der Thread bereits läuft, führt diese Funktion keine Aktion aus.
Die Wirkung des Parameters ` priority ` hängt von der Planungsrichtlinie des Betriebssystems ab. Insbesondere wird ` priority ` auf Systemen ignoriert, die keine Thread-Prioritäten unterstützen (wie z. B. unter Linux; weitere Details finden Sie in der Dokumentation zu `sched_setscheduler` ).
Siehe auch ` run()` und ` terminate()`.
[private signal] void QThread::started()
Dieses Signal wird vom zugehörigen Thread ausgegeben, sobald dieser mit der Ausführung beginnt, sodass alle damit verbundenen Slots über einen Aufruf in der Warteschlange aufgerufen werden können. Auch wenn das Ereignis möglicherweise bereits vor dem Aufruf von run() gesendet wurde, kann die threadübergreifende Übermittlung des Signals noch ausstehen.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, kann jedoch nicht vom Benutzer ausgesendet werden.
Siehe auch ` run()` und ` finished()`.
[slot] void QThread::terminate()
Beendet die Ausführung des Threads. Je nach den Scheduling-Richtlinien des Betriebssystems wird der Thread möglicherweise sofort beendet – oder auch nicht. Verwenden Sie zur Sicherheit nach `terminate()` die Funktion ` QThread::wait()`.
Wenn der Thread beendet wird, werden alle Threads, die auf dessen Beendigung warten, geweckt.
Warnung: Diese Funktion ist gefährlich und von ihrer Verwendung wird abgeraten. Der Thread kann an jeder beliebigen Stelle seines Codeablaufs beendet werden. Threads können während der Bearbeitung von Daten beendet werden. Der Thread hat keine Möglichkeit, seine eigenen Ressourcen aufzuräumen, gehaltene Mutexe freizugeben usw. Kurz gesagt: Verwenden Sie diese Funktion nur, wenn es absolut notwendig ist.
Die Beendigung kann durch den Aufruf von ` QThread::setTerminationEnabled()` explizit aktiviert oder deaktiviert werden. Der Aufruf dieser Funktion bei deaktivierter Beendigung führt dazu, dass die Beendigung aufgeschoben wird, bis sie wieder aktiviert wird. Weitere Informationen finden Sie in der Dokumentation zu ` QThread::setTerminationEnabled()`.
Hinweis: Diese Funktion ist threadsicher.
Siehe auch ` setTerminationEnabled()`.
[static] void QThread::usleep(unsigned long usecs)
Dies ist eine überladene Funktion, die dem Aufruf von
QThread::sleep(std::chrono::microseconds{secs});Hinweis: Diese Funktion garantiert keine Genauigkeit. Unter hoher Auslastung kann die Anwendung möglicherweise länger als usecs in den Ruhezustand wechseln. Einige Betriebssysteme runden usecs möglicherweise auf 10 ms oder 15 ms auf; unter Windows wird der Wert auf ein Vielfaches von 1 ms aufgerundet.
Siehe auch sleep() und msleep().
bool QThread::wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
Blockiert den Thread, bis eine der folgenden Bedingungen erfüllt ist:
- Der mit diesem „ QThread “-Objekt verbundene Thread hat die Ausführung beendet (d. h., wenn er von „ run()“ zurückkehrt). Diese Funktion gibt „true“ zurück, wenn der Thread beendet ist. Sie gibt ebenfalls „true“ zurück, wenn der Thread noch nicht gestartet wurde.
- Die Frist „ deadline “ ist abgelaufen. Diese Funktion gibt „false“ zurück, wenn die Frist abgelaufen ist.
Ein auf „ QDeadlineTimer::Forever “ (Standard) gesetzter Deadline-Timer läuft niemals ab: In diesem Fall gibt die Funktion erst dann einen Wert zurück, wenn der Thread von ` run()` zurückkehrt oder wenn der Thread noch nicht gestartet wurde.
Dies bietet eine ähnliche Funktionalität wie die POSIX-Funktion ` pthread_join() `.
Hinweis: Auf einigen Betriebssystemen kann diese Funktion „true“ zurückgeben, während der Betriebssystem-Thread noch läuft und möglicherweise Aufräumcode wie C++11- thread_local -Destruktoren ausführt. Zu den Betriebssystemen, bei denen diese Funktion erst dann „true“ zurückgibt, wenn der Betriebssystem-Thread vollständig beendet ist, gehören Linux, Windows und Apple-Betriebssysteme.
Siehe auch ` sleep()` und ` terminate()`.
bool QThread::wait(unsigned long time)
time ist die Wartezeit in Millisekunden. Wenn „ time “ den Wert ULONG_MAX annimmt, läuft die Wartezeit unbegrenzt.
Dies ist eine überladene Funktion.
[static] void QThread::yieldCurrentThread()
Überträgt die Ausführung des aktuellen Threads an einen anderen ausführbaren Thread, sofern vorhanden. Beachten Sie, dass das Betriebssystem entscheidet, zu welchem Thread gewechselt wird.
© 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.