QThread Class
Die Klasse QThread bietet eine plattformunabhängige Möglichkeit zur Verwaltung von Threads. Mehr...
Kopfzeile: | #include <QThread> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Vererbungen: | QObject |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QThread ist Teil der Threading-Klassen.
Öffentliche Typen
enum | Priority { IdlePriority, LowestPriority, LowPriority, NormalPriority, HighPriority, …, InheritPriority } |
Ö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() |
void | setEventDispatcher(QAbstractEventDispatcher *eventDispatcher) |
void | setPriority(QThread::Priority priority) |
void | setStackSize(uint stackSize) |
uint | stackSize() const |
bool | wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever)) |
bool | wait(unsigned long time) |
Reimplementierte ö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) |
Detaillierte Beschreibung
Ein QThread-Objekt verwaltet einen Kontrollfaden 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 Worker-Slots würde dann in einem separaten Thread ausgeführt. Es steht Ihnen jedoch frei, die Worker-Slots mit jedem Signal, von jedem Objekt, in jedem Thread zu verbinden. Es ist sicher, Signale und Slots über verschiedene Threads hinweg zu verbinden, dank eines Mechanismus namens queued connections.
Eine andere Möglichkeit, Code in einem separaten Thread laufen zu lassen, ist die Unterklasse QThread und die Neuimplementierung von run(). Ein Beispiel:
class WorkerThread : public QThread { Q_OBJECT 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, nachdem die run-Funktion zurückgekehrt ist. Es wird keine Ereignisschleife in dem Thread laufen, es sei denn, Sie rufen exec() auf.
Es ist wichtig, sich daran zu erinnern, dass eine QThread-Instanz lives in der alte Thread ist, der sie instanziiert hat, nicht der neue Thread, der run() aufruft. Das bedeutet, dass alle Warteschlangen-Slots von QThread und invoked methods 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 einen unterklassifizierten QThread implementiert werden.
Im Gegensatz zu Slots in der Warteschlange oder aufgerufenen Methoden, werden Methoden, die direkt auf dem QThread-Objekt aufgerufen werden, in dem Thread ausgeführt, der die Methode aufruft. Bei der Subklassifizierung von QThread ist zu beachten, dass der Konstruktor in dem alten Thread ausgeführt wird, während run() in dem neuen Thread ausgeführt wird. Wenn auf eine Mitgliedsvariable von beiden Funktionen aus zugegriffen wird, dann wird die Variable von zwei verschiedenen Threads aus aufgerufen. Vergewissern Sie sich, dass dies gefahrlos möglich ist.
Hinweis: Bei der Interaktion mit Objekten über verschiedene Threads hinweg ist Vorsicht geboten. In der Regel können Funktionen nur von dem Thread aus aufgerufen werden, der das QThread-Objekt selbst erstellt hat (z.B. setPriority()), es sei denn, die Dokumentation sagt etwas anderes. Siehe Synchronisieren von Threads für Details.
Verwalten von Threads
QThread wird Sie über ein Signal benachrichtigen, wenn der Thread started() und finished() ist, oder Sie können isFinished() und isRunning() verwenden, um den Zustand des Threads abzufragen.
Sie können den Thread anhalten, indem Sie exit() oder quit() aufrufen. In extremen Fällen können Sie die Ausführung eines Threads mit terminate() erzwingen. Dies ist jedoch gefährlich und es wird davon abgeraten. Bitte lesen Sie die Dokumentation zu terminate() und setTerminationEnabled() für detaillierte Informationen.
Sie möchten oft Objekte, die in einem Thread leben, deallokieren, wenn ein Thread endet. Verbinden Sie zu diesem Zweck 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 bestimmte Zeit vergangen ist).
QThread bietet auch statische, plattformunabhängige Sleep-Funktionen: sleep(), msleep() und usleep() erlauben die Auflösung von ganzen Sekunden, Millisekunden bzw. Mikrosekunden.
Hinweis: wait() und die sleep() Funktionen sollten im Allgemeinen unnötig sein, da Qt ein ereignisgesteuertes Framework ist. Anstelle von wait() sollten Sie auf das Signal finished() warten. Anstelle der sleep() Funktionen sollten Sie QChronoTimer verwenden.
Die statischen Funktionen currentThreadId() und currentThread() geben Identifikatoren für den aktuell ausgeführten Thread zurück. Die erste Funktion gibt eine plattformspezifische ID für den Thread zurück, die zweite einen QThread-Zeiger.
Um den Namen auszuwählen, den Ihr Thread erhalten soll (wie er z. B. unter Linux mit dem Befehl ps -L
ermittelt wird), können Sie setObjectName() aufrufen, bevor Sie den Thread starten. Wenn Sie setObjectName() nicht aufrufen, wird der Name Ihres Threads der Klassenname des Laufzeittyps Ihres Thread-Objekts sein (z. B. "RenderThread"
im Fall des Mandelbrot-Beispiels, da dies der Name der QThread-Unterklasse ist). Beachten Sie, dass dies derzeit nicht mit den Release-Builds unter Windows verfügbar ist.
Siehe auch Thread-Unterstützung in Qt, QThreadStorage, Synchronisieren von Threads, Mandelbrot, Producer und Consumer mit Semaphoren und Producer und Consumer mit Wartebedingungen.
Dokumentation der Mitgliedstypen
enum QThread::Priority
Dieser Enum-Typ gibt an, wie das Betriebssystem neu erstellte Threads planen sollte.
Konstante | Wert | Beschreibung |
---|---|---|
QThread::IdlePriority | 0 | nur geplant, wenn keine anderen Threads laufen. |
QThread::LowestPriority | 1 | seltener geplant als LowPriority. |
QThread::LowPriority | 2 | seltener geplant als NormalPriority. |
QThread::NormalPriority | 3 | die Standardpriorität des Betriebssystems. |
QThread::HighPriority | 4 | häufiger geplant als NormalPriority. |
QThread::HighestPriority | 5 | häufiger als HighPriority geplant. |
QThread::TimeCriticalPriority | 6 | so oft wie möglich geplant. |
QThread::InheritPriority | 7 | die gleiche Priorität wie der erzeugende Thread verwenden. Dies ist die Standardeinstellung. |
Dokumentation der Mitgliedsfunktionen
[explicit]
QThread::QThread(QObject *parent = nullptr)
Konstruiert einen neuen QThread, um einen neuen Thread zu verwalten. Die parent übernimmt den Besitz des QThreads. Der Thread beginnt nicht mit der Ausführung, bis start() aufgerufen wird.
Siehe auch start().
[virtual noexcept]
QThread::~QThread()
Zerstört das 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) wird zu einem Programmabsturz führen. Warten Sie auf das Signal finished(), bevor Sie QThread löschen.
Seit Qt 6.3 ist es erlaubt, eine QThread Instanz zu löschen, die durch einen Aufruf von QThread::create() erzeugt wurde, auch 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, ihn 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)
Erzeugt 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 mit seinen Signalen zu verbinden, QObjects in den Thread zu verschieben, die Priorität des neuen Threads zu wählen und so weiter. Die Funktion f wird in dem neuen Thread aufgerufen.
Gibt die neu erstellte QThread Instanz zurück.
Hinweis: Der Aufrufer erwirbt das Eigentum an der zurückgegebenen QThread Instanz.
Warnung: Rufen Sie start() auf die zurückgegebene QThread Instanz nicht mehr als einmal auf; dies führt zu undefiniertem Verhalten.
Siehe auch start().
[static]
QThread *QThread::currentThread()
Gibt einen Zeiger auf eine QThread zurück, die 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 wird für interne Zwecke verwendet und sollte in keinem Anwendungscode verwendet werden.
Hinweis: Unter Windows gibt diese Funktion das DWORD (Windows-Thread ID) zurück, das von der Win32-Funktion GetCurrentThreadId() zurückgegeben wird, nicht das Pseudo-HANDLE (Windows-Thread HANDLE), das von der Win32-Funktion GetCurrentThread() zurückgegeben wird.
[override virtual]
bool QThread::event(QEvent *event)
Reimplements: QObject::event(QEvent *e).
QAbstractEventDispatcher *QThread::eventDispatcher() const
Gibt einen Zeiger auf das Event-Dispatcher-Objekt für den Thread zurück. Wenn kein Event-Dispatcher für den Thread existiert, gibt diese Funktion nullptr
zurück.
Siehe auch setEventDispatcher().
[protected]
int QThread::exec()
Tritt in die Ereignisschleife ein und wartet, bis exit() aufgerufen wird, und gibt den Wert zurück, der an exit() übergeben wurde. Der zurückgegebene Wert ist 0, wenn exit() über quit() aufgerufen wird.
Diese Funktion soll aus run() heraus aufgerufen werden. Es ist notwendig, diese Funktion aufzurufen, 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.
[slot]
void QThread::exit(int returnCode = 0)
Weist die Ereignisschleife des Threads an, sie mit einem Rückgabewert zu beenden.
Nach dem Aufruf dieser Funktion verlässt der Thread die Ereignisschleife und kehrt zum Aufruf von QEventLoop::exec() zurück. Die Funktion QEventLoop::exec() gibt returnCode zurück.
Gemäß der Konvention bedeutet ein returnCode von 0 Erfolg, jeder Wert ungleich Null bedeutet einen Fehler.
Beachten Sie, dass diese Funktion, anders als die gleichnamige Funktion der C-Bibliothek , zum Aufrufer zurückkehrt - die Ereignisverarbeitung wird angehalten.
In diesem Thread werden keine QEventLoops mehr gestartet, bis QThread::exec() erneut aufgerufen wird. Wenn die Ereignisschleife in QThread::exec() nicht läuft, kehrt der nächste Aufruf von QThread::exec() ebenfalls sofort zurück.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch quit() und QEventLoop.
[private signal]
void QThread::finished()
Dieses Signal wird von dem zugehörigen Thread ausgegeben, kurz bevor er seine Ausführung beendet.
Wenn dieses Signal ausgegeben wird, hat die Ereignisschleife bereits aufgehört zu laufen. Es werden keine weiteren Ereignisse in dem Thread verarbeitet, mit Ausnahme von aufgeschobenen Löschereignissen. Dieses Signal kann mit QObject::deleteLater() verbunden werden, um Objekte in diesem Thread freizugeben.
Hinweis: Wenn der zugehörige Thread mit terminate() beendet wurde, ist es undefiniert, von welchem Thread dieses Signal ausgesendet wird.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.
Siehe auch started().
[static noexcept]
int QThread::idealThreadCount()
Gibt die ideale Anzahl von Threads zurück, die dieser Prozess parallel ausführen kann. Dies geschieht durch Abfrage der Anzahl der logischen Prozessoren, die diesem Prozess zur Verfügung stehen (falls vom Betriebssystem unterstützt) oder der Gesamtzahl der logischen Prozessoren im System. Diese Funktion gibt 1 zurück, wenn keiner der beiden Werte ermittelt werden konnte.
Hinweis: Auf Betriebssystemen, die die Einstellung der Affinität eines Threads zu einer Teilmenge aller logischen Prozessoren unterstützen, kann sich der von dieser Funktion zurückgegebene Wert zwischen Threads und im Laufe der Zeit ändern.
Hinweis: Auf Betriebssystemen, die CPU-Hotplugging und Hot-Unplugging unterstützen, kann sich der von dieser Funktion zurückgegebene Wert ebenfalls im Laufe der Zeit ändern (und beachten Sie, dass CPUs per Software ein- und ausgeschaltet werden können, ohne dass eine physische Hardware-Änderung erfolgt).
[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.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch isRunning().
bool QThread::isInterruptionRequested() const
Gibt true zurück, wenn die auf diesem Thread laufende Aufgabe angehalten werden soll. Eine Unterbrechung kann durch 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 prüfen oder zu verwenden, aber es ist ratsam, dies regelmäßig in lang laufenden Funktionen zu tun. Achten Sie darauf, sie 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 er der aktuelle Thread ist.
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 Haupt-Thread ist der Thread, in dem QCoreApplication erstellt wurde. Dies ist normalerweise der Thread, der die Funktion main()
aufgerufen hat, aber nicht unbedingt. Es ist der 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 false
.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch isFinished().
int QThread::loopLevel() const
Gibt die aktuelle Ereignisschleifenstufe des Threads zurück.
Hinweis: Dies kann nur innerhalb des Threads selbst aufgerufen werden, d.h. wenn es der aktuelle Thread ist.
[static]
void QThread::msleep(unsigned long msecs)
Dies ist eine überladene Funktion, die einem Aufruf entspricht:
QThread::sleep(std::chrono::milliseconds{msecs});
Hinweis: Diese Funktion garantiert keine Genauigkeit. Die Anwendung kann unter schweren Lastbedingungen länger schlafen als msecs. Einige Betriebssysteme können msecs auf 10 ms oder 15 ms aufrunden.
Siehe auch sleep() und usleep().
QThread::Priority QThread::priority() const
Gibt die Priorität für einen laufenden Thread 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. Äquivalent zum Aufruf von QThread::exit(0).
Diese Funktion bewirkt nichts, wenn der Thread keine Ereignisschleife hat.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch exit() und QEventLoop.
void QThread::requestInterruption()
die Unterbrechung des Threads anfordern. Diese Aufforderung hat beratenden Charakter und es obliegt dem auf dem Thread laufenden Code zu entscheiden, ob und wie er auf eine solche Aufforderung reagieren soll. Diese Funktion hält keine Ereignisschleife an, die auf dem Thread läuft, und beendet ihn in keiner Weise.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch isInterruptionRequested().
[virtual protected]
void QThread::run()
Der Startpunkt des Threads. 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. Der Rücksprung von dieser Methode beendet die Ausführung des Threads.
Siehe auch start() und wait().
void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)
Setzt den Event-Dispatcher für den Thread auf eventDispatcher. Dies ist nur möglich, solange noch kein Event-Dispatcher für den Thread installiert ist.
Ein Ereignis-Dispatcher wird automatisch für den Haupt-Thread erstellt, wenn QCoreApplication instanziiert wird, und auf start() für Hilfs-Threads.
Diese Methode übernimmt das Eigentum an dem Objekt.
Siehe auch eventDispatcher().
void QThread::setPriority(QThread::Priority priority)
Diese Funktion setzt die priority für einen laufenden Thread. Wenn der Thread nicht läuft, tut diese Funktion nichts und kehrt sofort zurück. Verwenden Sie start(), um einen Thread mit einer bestimmten Priorität zu starten.
Das Argument priority kann ein beliebiger Wert aus der Aufzählung QThread::Priority
sein, mit Ausnahme von InheritPriority
.
Die Auswirkung des priority Parameters ist abhängig von der Scheduling Policy des Betriebssystems. Insbesondere wird priority auf Systemen ignoriert, die keine Thread-Prioritäten unterstützen (wie unter Linux, siehe http://linux.die.net/man/2/sched_setscheduler für weitere Details).
Siehe auch Priority, priority(), und start().
void QThread::setStackSize(uint stackSize)
Setzt die Stackgröße für den Thread auf stackSize. Ist stackSize gleich Null, wählt das Betriebssystem oder die Laufzeitumgebung einen Standardwert. Andernfalls entspricht die Stackgröße des Threads dem angegebenen Wert (der auf- oder abgerundet werden kann).
Auf den meisten Betriebssystemen ist der für den Stack zugewiesene Speicher anfangs kleiner als stackSize und wächst, wenn der Thread den Stack benutzt. Dieser Parameter legt die maximale Größe fest, auf die der Stack anwachsen darf (d.h. er legt die Größe des virtuellen Speicherplatzes fest, den der Stack belegen darf).
Diese Funktion kann nur aufgerufen werden, bevor der Thread gestartet wird.
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 durch QThread gestartet worden sein.
Wenn enabled false ist, ist die Beendigung deaktiviert. Künftige Aufrufe von QThread::terminate() kehren sofort ohne Wirkung zurück. Stattdessen wird die Beendigung aufgeschoben, bis die Beendigung aktiviert wird.
Wenn enabled wahr ist, ist die Beendigung aktiviert. Zukünftige Aufrufe von QThread::terminate() werden den Thread normal beenden. Wenn die Beendigung aufgeschoben wurde (d.h. QThread::terminate() wurde mit deaktivierter Beendigung aufgerufen), wird diese Funktion den aufrufenden Thread sofort beenden. 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 nsecs zu schlafen.
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 Event-Handler (siehe QObject::event()).
Hinweis: Diese Funktion garantiert keine Genauigkeit. Die Anwendung kann bei hoher Last länger schlafen als nsecs.
Diese Funktion wurde in Qt 6.6 eingeführt.
[static]
void QThread::sleep(unsigned long secs)
Zwingt den aktuellen Thread, für secs Sekunden zu schlafen.
Dies ist eine überladene Funktion, die dem Aufruf entspricht:
QThread::sleep(std::chrono::seconds{secs});
Siehe auch msleep() und usleep().
uint QThread::stackSize() const
Gibt die maximale Stapelgröße für den Thread zurück (falls mit setStackSize() festgelegt); andernfalls wird Null zurückgegeben.
Siehe auch setStackSize().
[slot]
void QThread::start(QThread::Priority priority = InheritPriority)
Beginnt die Ausführung des Threads durch Aufruf von run(). Das Betriebssystem plant den Thread entsprechend dem Parameter priority. Wenn der Thread bereits läuft, bewirkt diese Funktion nichts.
Die Auswirkung des priority Parameters ist abhängig von der Scheduling Policy des Betriebssystems. Insbesondere wird priority auf Systemen ignoriert, die keine Thread-Prioritäten unterstützen (wie z.B. unter Linux, siehe die sched_setscheduler-Dokumentation für weitere Details).
Siehe auch run() und terminate().
[private signal]
void QThread::started()
Dieses Signal wird von dem zugehörigen Thread ausgesendet, wenn er mit der Ausführung beginnt, so dass alle mit ihm verbundenen Slots über einen Aufruf in der Warteschlange aufgerufen werden können. Auch wenn das Ereignis bereits vor dem Aufruf von run() bekannt gegeben wurde, kann eine Thread-übergreifende Zustellung des Signals noch ausstehen.
Hinweis: Dies ist ein privates Signal. Es kann in Signalverbindungen verwendet werden, aber nicht vom Benutzer ausgegeben werden.
Siehe auch run() und finished().
[slot]
void QThread::terminate()
Beendet die Ausführung des Threads. Je nach den Zeitplanungsrichtlinien des Betriebssystems kann der Thread sofort beendet werden oder nicht. Verwenden Sie QThread::wait() nach terminate(), um sicherzugehen.
Wenn der Thread beendet wird, werden alle Threads, die auf die Beendigung des Threads warten, aufgeweckt.
Warnung: Diese Funktion ist gefährlich und es wird von ihrer Verwendung abgeraten. Der Thread kann an jeder Stelle seines Codepfades beendet werden. Threads können während der Änderung von Daten beendet werden. Es gibt keine Möglichkeit für den Thread, nach sich selbst aufzuräumen, gehaltene Mutexe zu entsperren, 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 die Beendigung wieder aktiviert wird. Siehe die Dokumentation von QThread::setTerminationEnabled() für weitere Informationen.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch setTerminationEnabled().
[static]
void QThread::usleep(unsigned long usecs)
Dies ist eine überladene Funktion, die einem Aufruf entspricht:
QThread::sleep(std::chrono::microseconds{secs});
Hinweis: Diese Funktion garantiert keine Genauigkeit. Die Anwendung kann bei starker Belastung länger schlafen als usecs. Einige Betriebssysteme können usecs auf 10 ms oder 15 ms aufrunden; unter Windows wird es 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 auch true zurück, wenn der Thread noch nicht gestartet wurde.
- Die deadline ist erreicht. Diese Funktion gibt false zurück, wenn die Frist erreicht ist.
Ein Deadline-Timer, der auf QDeadlineTimer::Forever
(Standardeinstellung) gesetzt ist, läuft nie ab: In diesem Fall kehrt die Funktion nur zurück, wenn der Thread von run() zurückkehrt oder wenn der Thread noch nicht gestartet ist.
Dies bietet eine ähnliche Funktionalität wie die POSIX-Funktion pthread_join()
.
Siehe auch sleep() und terminate().
bool QThread::wait(unsigned long time)
Dies ist eine überladene Funktion.
time ist die zu wartende Zeit in Millisekunden. Wenn time ULONG_MAX ist, wird die Wartezeit nie überschritten.
[static]
void QThread::yieldCurrentThread()
Übergibt die Ausführung des aktuellen Threads an einen anderen lauffähigen Thread, falls vorhanden. Beachten Sie, dass das Betriebssystem entscheidet, zu welchem Thread gewechselt werden soll.
© 2025 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.