Sur cette page

QThread Class

La classe QThread offre un moyen indépendant de la plate-forme de gérer les threads. En savoir plus…

En-tête : #include <QThread>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Hérite de : QObject

Types publics

enum Priority { IdlePriority, LowestPriority, LowPriority, NormalPriority, HighPriority, …, InheritPriority }
(since 6.9) enum class QualityOfService { Auto, High, Eco }

Fonctions publiques

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)

Fonctions publiques réimplémentées

virtual bool event(QEvent *event) override

Slots publics

void exit(int returnCode = 0)
void quit()
void start(QThread::Priority priority = InheritPriority)
void terminate()

Signaux

void finished()
void started()

Membres publics statiques

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()

Fonctions protégées

int exec()
virtual void run()

Membres statiques protégés

void setTerminationEnabled(bool enabled = true)

Description détaillée

Un objet QThread gère un thread de contrôle au sein du programme. Les QThreads commencent à s'exécuter dans la fonction ` run()`. Par défaut, la fonction ` run()` lance la boucle d'événements en appelant ` exec()` et exécute une boucle d'événements Qt au sein du thread.

Vous pouvez utiliser des objets « worker » en les transférant vers le thread à l’aide de la méthode QObject::moveToThread().

class Worker : public QObject
{
    Q_OBJECT

public slots:
    void doWork(const QString &parameter) {
        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 &);
};

Le code contenu dans le slot du Worker s'exécuterait alors dans un thread distinct. Cependant, vous êtes libre de connecter les slots du Worker à n'importe quel signal, provenant de n'importe quel objet, dans n'importe quel thread. La connexion de signaux et de slots entre différents threads est sans risque, grâce à un mécanisme appelé queued connections.

Une autre façon de faire s’exécuter du code dans un thread distinct consiste à créer une sous-classe de `QThread` et à réimplémenter la méthode ` run()`. Par exemple :

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();
}

Dans cet exemple, le thread se terminera une fois que la fonction `run` aura renvoyé une valeur. Aucune boucle d’événements ne s’exécutera dans le thread, à moins que vous n’appeliez ` exec()`.

Il est important de garder à l’esprit qu’une instance de QThread appelle ` lives in ` depuis l’ancien thread qui l’a instanciée, et non depuis le nouveau thread qui appelle ` run()`. Cela signifie que tous les slots et ` invoked methods ` mis en file d’attente par QThread s’exécuteront dans l’ancien thread. Ainsi, un développeur souhaitant invoquer des slots dans le nouveau thread doit utiliser l’approche « worker-object » ; les nouveaux slots ne doivent pas être implémentés directement dans une sous-classe de QThread.

Contrairement aux slots mis en file d’attente ou aux méthodes invoquées, les méthodes appelées directement sur l’objet QThread s’exécuteront dans le thread qui appelle la méthode. Lorsque vous sous-classez QThread, gardez à l’esprit que le constructeur s’exécute dans l’ancien thread tandis que la méthode ` run()` s’exécute dans le nouveau thread. Si une variable membre est accédée depuis ces deux fonctions, cela signifie qu’elle est accédée depuis deux threads différents. Vérifiez que cela ne présente aucun risque.

Remarque : il convient d’êtreprudent lors des interactions avec des objets entre différents threads. En règle générale, les fonctions ne peuvent être appelées qu’à partir du thread qui a créé l’objet QThread lui-même (par exemple, ` setPriority()`), sauf indication contraire dans la documentation. Voir Synchronisation des threads pour plus de détails.

Gestion des threads

QThread vous avertit via un signal lorsque le thread est en cours d'started() et d'finished(), ou vous pouvez utiliser isFinished() et isRunning() pour interroger l'état du thread.

Vous pouvez arrêter le thread en appelant ` exit()` ou ` quit()`. Dans des cas extrêmes, vous pouvez vouloir forcer l'arrêt d'un thread en cours d'exécution à l'aide de ` terminate()`. Cependant, cette opération est dangereuse et déconseillée. Veuillez consulter la documentation relative à ` terminate()` et ` setTerminationEnabled()` pour plus d'informations.

On souhaite souvent désallouer les objets présents dans un thread lorsque celui-ci se termine. Pour ce faire, associez le signal finished() à QObject::deleteLater().

Utilisez la fonction wait() pour bloquer le thread appelant jusqu’à ce que l’autre thread ait terminé son exécution (ou jusqu’à ce qu’un délai spécifié se soit écoulé).

QThread fournit également des fonctions de mise en veille statiques et indépendantes de la plateforme : sleep(), msleep() et usleep() permettent respectivement une résolution en secondes, en millisecondes et en microsecondes.

Remarque : les fonctionswait() et sleep() ne devraient en général pas être nécessaires, car Qt est un framework piloté par les événements. Au lieu d’utiliser wait(), envisagez d’écouter le signal finished(). Au lieu des fonctions sleep(), envisagez d’utiliser QChronoTimer.

Les fonctions statiques currentThreadId() et currentThread() renvoient des identifiants pour le thread en cours d’exécution. La première renvoie un identifiant spécifique à la plate-forme pour le thread ; la seconde renvoie un pointeur vers un QThread.

Pour choisir le nom qui sera attribué à votre thread (tel qu’identifié par la commande ` ps -L ` sous Linux, par exemple), vous pouvez appeler ` setObjectName()` avant de lancer le thread. Si vous n’appelez pas la fonction setObjectName(), le nom attribué à votre thread sera le nom de la classe du type d’exécution de votre objet thread (par exemple, "RenderThread" dans le cas de l’exemple Mandelbrot, car c’est le nom de la sous-classe de QThread). Notez que cette fonctionnalité n’est actuellement pas disponible avec les versions de production sous Windows.

Voir également le multithreading dans Qt, QThreadStorage, la synchronisation des threads, Mandelbrot, le modèle producteur-consommateur à l’aide de sémaphores, et le modèle producteur-consommateur à l’aide de conditions d’attente.

Documentation sur les types de membres

enum QThread::Priority

Ce type d'énumération indique comment le système d'exploitation doit planifier les threads nouvellement créés.

ConstanteValeurDescription
QThread::IdlePriority0planifié uniquement lorsqu’aucun autre thread n’est en cours d’exécution.
QThread::LowestPriority1planifié moins souvent que LowPriority.
QThread::LowPriority2planifiée moins souvent que « NormalPriority ».
QThread::NormalPriority3Priorité par défaut du système d'exploitation.
QThread::HighPriority4planifié plus souvent que « NormalPriority ».
QThread::HighestPriority5planifiée plus souvent que « HighPriority ».
QThread::TimeCriticalPriority6planifiée aussi souvent que possible.
QThread::InheritPriority7utilise la même priorité que le thread créateur. C'est la valeur par défaut.

[since 6.9] enum class QThread::QualityOfService

Cette énumération décrit le niveau de qualité de service d'un thread et fournit au planificateur des informations sur le type de tâche exécutée par ce thread. Sur les plateformes présentant différents profils de processeur, ou permettant de réduire la fréquence d'horloge de certains cœurs d'un processeur, cela permet au planificateur de sélectionner ou de configurer un cœur de processeur présentant des caractéristiques de performance et de consommation d'énergie adaptées au thread.

ConstanteValeurDescription
QThread::QualityOfService::Auto0Valeur par défaut : le planificateur décide sur quel cœur de processeur exécuter le thread.
QThread::QualityOfService::High1Le planificateur doit exécuter ce thread sur un cœur de processeur à hautes performances.
QThread::QualityOfService::Eco2Le planificateur devrait exécuter ce thread sur un cœur de processeur économe en énergie.

Cette énumération a été introduite dans Qt 6.9.

Voir également Priority, serviceLevel() et QThreadPool::serviceLevel().

Documentation des fonctions membres

[explicit] QThread::QThread(QObject *parent = nullptr)

Crée un nouvel objet QThread pour gérer un nouveau thread. L'parent prend possession du QThread. Le thread ne commence pas à s'exécuter tant que la fonction start() n'a pas été appelée.

Voir également start().

[virtual noexcept] QThread::~QThread()

Supprime l'objet ` QThread`.

Notez que la suppression d’un objet ` QThread ` n’interrompt pas l’exécution du thread qu’il gère. La suppression d’un ` QThread ` en cours d’exécution (c’est-à-dire lorsque ` isFinished()` renvoie ` false`) entraînera un plantage du programme. Attendez le signal ` finished()` avant de supprimer le ` QThread`.

Depuis Qt 6.3, il est possible de supprimer une instance de ` QThread ` créée par un appel à ` QThread::create()` même si le thread correspondant est toujours en cours d'exécution. Dans ce cas, Qt envoie une demande d’interruption à ce thread (via ` requestInterruption()`) ; demande à la boucle d’événements du thread (le cas échéant) de se fermer (via ` quit()`) ; et se bloque jusqu’à ce que le thread ait terminé.

Voir également create(), isInterruptionRequested(), exec() et quit().

[static] template <typename Function, typename... Args> QThread *QThread::create(Function &&f, Args &&... args)

Crée un nouvel objet ` QThread ` qui exécutera la fonction ` f ` avec les arguments ` args`.

Le nouveau thread n’est pas lancé : il doit l’être par un appel explicite à start(). Cela vous permet de vous connecter à ses signaux, de déplacer des QObjects vers le thread, de choisir la priorité du nouveau thread, etc. La fonction f sera appelée dans le nouveau thread.

Renvoie l'instance QThread nouvellement créée.

Remarque : l'appelant acquiert la propriété de l'instance ` QThread ` renvoyée.

Avertissement : n’appelez pas start() plus d’une fois sur l’instance QThread renvoyée ; cela entraînerait un comportement indéfini.

Voir également start().

[static] QThread *QThread::currentThread()

Renvoie un pointeur vers une instance de ` QThread ` qui gère le thread en cours d'exécution.

[static noexcept] Qt::HANDLE QThread::currentThreadId()

Renvoie le descripteur du thread en cours d'exécution.

Avertissement : le descripteur renvoyé par cette fonction est utilisé à des fins internes et ne doit pas être utilisé dans le code d'une application.

Remarque : sous Windows, cette fonction renvoie la valeur DWORD (identifiant du thread Windows) renvoyée par la fonction Win32 GetCurrentThreadId(), et non le pseudo-HANDLE (descripteur de thread Windows) renvoyé par la fonction Win32 GetCurrentThread().

[override virtual] bool QThread::event(QEvent *event)

Réimplémente : QObject::event(QEvent *e).

QAbstractEventDispatcher *QThread::eventDispatcher() const

Renvoie un pointeur vers l'objet « event dispatcher » du thread. Si aucun « event dispatcher » n'existe pour ce thread, cette fonction renvoie ` nullptr`.

Voir également setEventDispatcher().

[protected] int QThread::exec()

Entre dans la boucle d'événements et attend que la fonction ` exit()` soit appelée, en renvoyant la valeur qui a été transmise à ` exit()`. La valeur renvoyée est 0 si la fonction ` exit()` est appelée via ` quit()`.

Cette fonction est destinée à être appelée depuis l'intérieur de run(). Il est nécessaire d'appeler cette fonction pour lancer la gestion des événements.

Remarque : cette fonction ne peut être appelée qu’au sein du thread lui-même, c’est-à-dire lorsqu’il s’agit du thread actif.

Voir également quit() et exit().

[slot] void QThread::exit(int returnCode = 0)

Indique à la boucle d'événements du thread de se terminer avec un code de retour.

Après l'appel de cette fonction, le thread quitte la boucle d'événements et revient de l'appel à QEventLoop::exec(). La fonction QEventLoop::exec() renvoie returnCode.

Par convention, une valeur de ` returnCode ` égale à 0 signifie que l'opération a réussi ; toute valeur différente de zéro indique une erreur.

Notez que, contrairement à la fonction de la bibliothèque C du même nom, cette fonction revient bien à l’appelant : c’est le traitement des événements qui s’arrête.

Aucune boucle d’événements (QEventLoop) ne sera plus lancée dans ce thread tant que la fonction QThread::exec() n’aura pas été appelée à nouveau. Si la boucle d’événements de QThread::exec() n’est pas en cours d’exécution, le prochain appel à QThread::exec() renverra également une valeur immédiatement.

Remarque : cette fonction est thread-safe.

Voir également quit() et QEventLoop.

[private signal] void QThread::finished()

Ce signal est émis par le thread associé juste avant la fin de son exécution.

Lorsque ce signal est émis, la boucle d'événements a déjà cessé de s'exécuter. Aucun autre événement ne sera traité dans le thread, à l'exception des événements de suppression différée. Ce signal peut être associé à la fonction QObject::deleteLater(), afin de libérer les objets dans ce thread.

Remarque : si le thread associé a été arrêté à l’aide de la fonction ` terminate()`, le thread à partir duquel ce signal est émis n’est pas défini.

Remarque : il s’agit d’un signal privé. Il peut être utilisé dans des connexions de signaux, mais ne peut pas être émis par l’utilisateur.

Voir également started().

[static noexcept] int QThread::idealThreadCount()

Renvoie le nombre idéal de threads que ce processus peut exécuter en parallèle. Pour ce faire, la fonction interroge le nombre de processeurs logiques disponibles pour ce processus (si cette fonctionnalité est prise en charge par le système d'exploitation) ou le nombre total de processeurs logiques du système. Cette fonction renvoie 1 si aucune de ces deux valeurs n'a pu être déterminée.

Remarque : sur les systèmes d’exploitation qui prennent en charge la configuration de l’affinité d’un thread avec un sous-ensemble de tous les processeurs logiques, la valeur renvoyée par cette fonction peut varier d’un thread à l’autre et au fil du temps.

Remarque : sur les systèmes d'exploitation prenant en charge la connexion et la déconnexion à chaud des processeurs, la valeur renvoyée par cette fonction peut également varier au fil du temps (à noter que les processeurs peuvent être activés et désactivés par un logiciel, sans modification physique du matériel).

[noexcept, since 6.8] bool QThread::isCurrentThread() const

Renvoie « true » si ce thread est de type « QThread::currentThread ».

Cette fonction a été introduite dans Qt 6.8.

Voir également currentThreadId().

bool QThread::isFinished() const

Renvoie ` true ` si le thread est terminé ; sinon, renvoie ` false`.

Un thread est considéré comme terminé s’il est revenu de la fonction run() et si le signal finished() a été émis.

Notez que le thread peut encore s’exécuter pendant un temps indéterminé après l’émission du signal ` finished()`, afin d’effectuer des opérations de nettoyage telles que l’exécution des destructeurs des variables ` thread_local `. Pour synchroniser tous les effets du thread, appelez ` wait()` et vérifiez qu’elle renvoie `true`.

Remarque : cette fonction est thread-safe.

Voir également isRunning().

bool QThread::isInterruptionRequested() const

Renvoie `true` si la tâche s'exécutant sur ce thread doit être interrompue. Une interruption peut être demandée par la fonction ` requestInterruption()`.

Cette fonction permet de rendre les tâches de longue durée facilement interrompables. Il est sans risque de ne jamais vérifier ni tenir compte de la valeur renvoyée par cette fonction ; il est toutefois conseillé de le faire régulièrement dans les fonctions de longue durée. Veillez à ne pas l'appeler trop souvent, afin de limiter la surcharge.

void long_task() {
     forever {
        if ( QThread::currentThread()->isInterruptionRequested() ) {
            return;
        }
    }
}

Remarque : cette fonction ne peut être appelée qu’au sein du thread lui-même, c’est-à-dire lorsqu’il s’agit du thread actif.

Voir également currentThread() et requestInterruption().

[static noexcept, since 6.8] bool QThread::isMainThread()

Indique si le thread en cours d'exécution est le thread principal.

Le thread principal est celui dans lequel QCoreApplication a été créé. Il s'agit généralement du thread qui a appelé la fonction main(), mais ce n'est pas nécessairement le cas. C'est le thread qui traite les événements de l'interface graphique et dans lequel des objets graphiques (QWindow, QWidget) peuvent être créés.

Cette fonction a été introduite dans Qt 6.8.

Voir également currentThread() et QCoreApplication::instance().

bool QThread::isRunning() const

Renvoie ` true ` si le thread est en cours d'exécution ; sinon, renvoie ` false`.

Un thread est considéré comme en cours d'exécution si QThread a été lancé avec start() mais n'est pas encore terminé.

Notez que le thread peut encore s’exécuter pendant une durée indéterminée après l’émission du signal ` finished()`, afin d’effectuer des opérations de nettoyage telles que l’exécution des destructeurs des variables ` thread_local `. Pour synchroniser tous les effets du thread, appelez ` wait()` et vérifiez qu’elle renvoie `true`.

Remarque : cette fonction est thread-safe.

Voir également isFinished().

int QThread::loopLevel() const

Renvoie le niveau actuel de la boucle d'événements pour le thread.

Remarque : cette fonction ne peut être appelée qu'au sein du thread lui-même, c'est-à-dire lorsqu'il s'agit du thread actif.

[static] void QThread::msleep(unsigned long msecs)

Il s'agit d'une fonction surchargée, équivalente à l'appel suivant :

QThread::sleep(std::chrono::milliseconds{msecs});

Remarque : cette fonction ne garantit pas la précision. L'application peut rester inactive plus longtemps que msecs en cas de charge importante. Certains systèmes d'exploitation peuvent arrondir msecs à 10 ms ou 15 ms.

Voir également sleep() et usleep().

QThread::Priority QThread::priority() const

Renvoie la priorité d'un thread en cours d'exécution. Si le thread n'est pas en cours d'exécution, cette fonction renvoie « InheritPriority ».

Voir également Priority, setPriority() et start().

[slot] void QThread::quit()

Indique à la boucle d'événements du thread de se terminer avec un code de retour égal à 0 (succès). Cela revient à appeler la fonction ` QThread::exit(0)`.

Cette fonction ne fait rien si le thread ne dispose pas d'une boucle d'événements.

Remarque : cette fonction est sûre pour les threads.

Voir également exit() et QEventLoop.

void QThread::requestInterruption()

Demande l'interruption du thread. Cette demande est à titre indicatif et il appartient au code s'exécutant sur le thread de décider s'il doit y donner suite et, le cas échéant, de quelle manière. Cette fonction n'arrête aucune boucle d'événements s'exécutant sur le thread et ne le termine en aucune manière.

Cette fonction n'a aucun effet sur le thread principal et ne fait rien si le thread n'est pas en cours d'exécution.

Remarque : cette fonction est sûre pour les threads.

Voir également ` isInterruptionRequested()`.

[virtual protected] void QThread::run()

Point de départ du thread. Après l'appel à ` start()`, le thread nouvellement créé appelle cette fonction. L'implémentation par défaut se contente d'appeler ` exec()`.

Vous pouvez réimplémenter cette fonction pour faciliter la gestion avancée des threads. Le retour de cette méthode mettra fin à l'exécution du thread.

Voir également start() et wait().

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

Renvoie le niveau actuel de qualité de service (QoS) du thread.

Cette fonction a été introduite dans Qt 6.9.

Voir également setServiceLevel() et QThreadPool::serviceLevel().

void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)

Définit le gestionnaire d'événements du thread sur eventDispatcher. Cela n'est possible que si aucun gestionnaire d'événements n'a encore été installé pour ce thread.

Un répartiteur d’événements est automatiquement créé pour le thread principal lors de l’instanciation de ` QCoreApplication ` et lors de l’appel de ` start()` pour les threads auxiliaires.

Cette méthode prend possession de l’objet.

Voir également ` eventDispatcher()`.

void QThread::setPriority(QThread::Priority priority)

Cette fonction définit l'priority e d'un thread en cours d'exécution. Si le thread n'est pas en cours d'exécution, cette fonction ne fait rien et renvoie immédiatement une valeur. Utilisez start() pour lancer un thread avec une priorité spécifique.

L'argument ` priority ` peut prendre n'importe quelle valeur de l'énumération ` QThread::Priority `, à l'exception de ` InheritPriority`.

L’effet du paramètre priority dépend de la politique d’ordonnancement du système d’exploitation. En particulier, la valeur priority sera ignorée sur les systèmes qui ne prennent pas en charge les priorités de threads (comme sous Linux ; voir http://linux.die.net/man/2/sched_setscheduler pour plus de détails).

Voir également Priority, priority() et start().

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

Définissez le niveau de qualité de service (QoS) de l'objet thread sur « serviceLevel ». Cette fonction ne peut être appelée qu'à partir du thread lui-même ou avant le démarrage de celui-ci !

Cette fonctionnalité n’est actuellement implémentée que sur les plateformes Apple et sous Windows. L’appel de fonction s’exécutera correctement sur les autres plateformes, mais n’aura pour l’instant aucun effet.

Cette fonction a été introduite dans Qt 6.9.

Voir également ` serviceLevel()` et ` QThreadPool::setServiceLevel()`.

void QThread::setStackSize(uint stackSize)

Définit la taille de la pile du thread à stackSize octets. Si la valeur de ` stackSize ` est égale à zéro, le système d’exploitation ou le moteur d’exécution choisira une valeur par défaut. Dans le cas contraire, la taille de la pile du thread correspondra à la valeur fournie (qui pourra être arrondie à l’unité supérieure ou inférieure).

Sur la plupart des systèmes d’exploitation, la quantité de mémoire allouée à la pile sera initialement inférieure à stackSize et augmentera à mesure que le thread utilise la pile. Ce paramètre définit la taille maximale jusqu’à laquelle elle sera autorisée à croître (c’est-à-dire qu’il définit la taille de l’espace de mémoire virtuelle que la pile est autorisée à occuper).

Cette fonction ne peut être appelée qu’avant le démarrage du thread.

Avertissement : la plupart des systèmes d’exploitation imposent des limites minimales et maximales à la taille de la pile d’un thread. Le thread ne pourra pas démarrer si la taille de la pile se situe en dehors de ces limites.

Voir également stackSize().

[static protected] void QThread::setTerminationEnabled(bool enabled = true)

Active ou désactive la terminaison du thread actuel en fonction du paramètre ` enabled `. Le thread doit avoir été lancé par la fonction ` QThread`.

Lorsque enabled est faux, la terminaison est désactivée. Les futurs appels à QThread::terminate() renverront immédiatement une valeur sans effet. La terminaison est alors reportée jusqu’à ce qu’elle soit activée.

Lorsque enabled est à « true », la terminaison est activée. Les futurs appels à QThread::terminate() mettront fin au thread normalement. Si la terminaison a été reportée (c'est-à-dire si QThread::terminate() a été appelée avec la terminaison désactivée), cette fonction mettra immédiatement fin au thread appelant. Notez que cette fonction ne renverra pas de résultat dans ce cas.

Voir également terminate().

[static, since 6.6] void QThread::sleep(std::chrono::nanoseconds nsecs)

Force le thread actuel à se mettre en veille pendant nsecs.

Évitez d’utiliser cette fonction si vous devez attendre qu’une condition donnée change. Connectez plutôt un slot au signal indiquant ce changement ou utilisez un gestionnaire d’événements (voir QObject::event()).

Remarque : cette fonction ne garantit pas la précision. L'application peut rester inactive plus longtemps que nsecs en cas de charge importante.

Cette fonction a été introduite dans Qt 6.6.

[static] void QThread::sleep(unsigned long secs)

Force le thread actuel à se mettre en veille pendant secs s de secondes.

Il s'agit d'une fonction surchargée, équivalente à l'appel de :

QThread::sleep(std::chrono::seconds{secs});

Voir également msleep() et usleep().

uint QThread::stackSize() const

Renvoie la taille maximale de la pile pour le thread en octets (si elle a été définie via ` setStackSize()`) ; sinon, renvoie zéro.

Voir également setStackSize().

[slot] void QThread::start(QThread::Priority priority = InheritPriority)

Lance l'exécution du thread en appelant la fonction ` run()`. Le système d'exploitation planifiera le thread conformément au paramètre ` priority `. Si le thread est déjà en cours d'exécution, cette fonction ne fait rien.

L'effet du paramètre priority dépend de la politique de planification du système d'exploitation. En particulier, priority sera ignoré sur les systèmes qui ne prennent pas en charge les priorités de threads (comme sous Linux ; voir la documentation de sched_setscheduler pour plus de détails).

Voir également run() et terminate().

[private signal] void QThread::started()

Ce signal est émis par le thread associé dès qu’il commence à s’exécuter ; ainsi, tous les slots qui lui sont associés peuvent être appelés via une invocation mise en file d’attente. Même si l’événement a pu être publié avant l’appel de run(), la transmission du signal entre threads peut encore être en attente.

Remarque : il s’agit d’un signal privé. Il peut être utilisé dans les connexions de signaux, mais ne peut pas être émis par l’utilisateur.

Voir également ` run()` et ` finished()`.

[slot] void QThread::terminate()

Mette fin à l'exécution du thread. Le thread peut être arrêté immédiatement ou non, selon les politiques d'ordonnancement du système d'exploitation. Pour plus de sécurité, utilisez ` QThread::wait()` après `terminate()`.

Lorsque le thread est interrompu, tous les threads en attente de sa fin sont réveillés.

Avertissement : cette fonction est dangereuse et son utilisation est déconseillée. Le thread peut être interrompu à n’importe quel moment de son exécution. Les threads peuvent être interrompus alors qu’ils modifient des données. Le thread n’a alors aucune possibilité de nettoyer son état, de déverrouiller les mutex qu’il détient, etc. En résumé, n’utilisez cette fonction qu’en cas d’absolue nécessité.

La terminaison peut être explicitement activée ou désactivée en appelant ` QThread::setTerminationEnabled()`. L'appel de cette fonction alors que la terminaison est désactivée entraîne le report de la terminaison jusqu'à ce que celle-ci soit réactivée. Consultez la documentation de ` QThread::setTerminationEnabled()` pour plus d'informations.

Remarque : cette fonction est sûre pour les threads.

Voir également setTerminationEnabled().

[static] void QThread::usleep(unsigned long usecs)

Il s'agit d'une fonction surchargée, équivalente à l'appel suivant :

QThread::sleep(std::chrono::microseconds{secs});

Remarque : cette fonction ne garantit pas la précision. L'application peut rester inactive plus longtemps que usecs en cas de charge importante. Certains systèmes d'exploitation peuvent arrondir usecs à 10 ms ou 15 ms ; sous Windows, la valeur sera arrondie à un multiple de 1 ms.

Voir également sleep() et msleep().

bool QThread::wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))

Bloque le thread jusqu'à ce que l'une des deux conditions suivantes soit remplie :

  • Le thread associé à cet objet ` QThread ` a terminé son exécution (c'est-à-dire lorsqu'il revient de la fonction ` run()`). Cette fonction renvoie `true` si le thread a terminé. Elle renvoie également `true` si le thread n'a pas encore été lancé.
  • L'deadline est atteinte. Cette fonction renvoie « false » si la date limite est atteinte.

Un minuteur de délai défini sur QDeadlineTimer::Forever (valeur par défaut) n’expirera jamais : dans ce cas, la fonction ne renvoie une valeur que lorsque le thread revient de la fonction run() ou si le thread n’a pas encore démarré.

Cela offre une fonctionnalité similaire à celle de la fonction POSIX pthread_join().

Remarque : sur certains systèmes d’exploitation, cette fonction peut renvoyer `true` alors que le thread du système d’exploitation est encore en cours d’exécution et peut être en train d’exécuter du code de nettoyage, tel que les destructeurs ` thread_local ` de C++11. Les systèmes d’exploitation sur lesquels cette fonction ne renvoie `true` qu’après la fermeture complète du thread du système d’exploitation incluent Linux, Windows et les systèmes d’exploitation Apple.

Voir également ` sleep()` et ` terminate()`.

bool QThread::wait(unsigned long time)

time est le temps d'attente en millisecondes. Si time vaut ULONG_MAX, l'attente n'expirera jamais.

Il s'agit d'une fonction surchargée.

[static] void QThread::yieldCurrentThread()

Cède l'exécution du thread actuel à un autre thread prêt à s'exécuter, s'il y en a un. Notez que c'est le système d'exploitation qui décide vers quel thread basculer.

© 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.