Sur cette page

QThread Class

La classe QThread fournit un moyen indépendant de la plate-forme de gérer les threads. Plus d'informations...

En-tête : #include <QThread>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Héritages : 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

Emplacements 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 fil de contrôle au sein du programme. Les QThreads commencent à s'exécuter à run(). Par défaut, run() démarre la boucle d'événements en appelant exec() et exécute une boucle d'événements Qt à l'intérieur du thread.

Vous pouvez utiliser des objets Worker en les déplaçant dans le thread à l'aide de 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 à l'intérieur du slot du travailleur s'exécute alors dans un thread séparé. Cependant, vous êtes libre de connecter les slots du travailleur à n'importe quel signal, provenant de n'importe quel objet, dans n'importe quel thread. La connexion des signaux et des slots entre différents threads est sûre, grâce à un mécanisme appelé queued connections.

Une autre façon de faire tourner le code dans un thread séparé est de sous-classer QThread et de réimplémenter 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 après le retour de la fonction run. Aucune boucle d'événements ne sera exécutée dans le fil d'exécution, à moins que vous n'appeliez exec().

Il est important de se rappeler qu'une instance de QThread lives in l'ancien thread qui l'a instancié, et non dans le nouveau thread qui appelle run(). Cela signifie que tous les slots en file d'attente de QThread et invoked methods seront exécutés dans l'ancien thread. Ainsi, un développeur qui souhaite 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 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 run() s'exécute dans le nouveau thread. Si une variable membre est accédée à partir des deux fonctions, la variable est accédée à partir de deux threads différents. Vérifiez qu'il n'y a pas de danger à le faire.

Remarque : il convient d'être prudent lorsque l'on interagit avec des objets entre plusieurs 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 informera via un signal lorsque le thread est started() et finished(), ou vous pouvez utiliser isFinished() et isRunning() pour demander l'état du thread.

Vous pouvez arrêter la discussion en appelant exit() ou quit(). Dans des cas extrêmes, vous pouvez vouloir forcer terminate() un thread en cours d'exécution. Toutefois, cette pratique est dangereuse et déconseillée. Veuillez lire la documentation de terminate() et setTerminationEnabled() pour obtenir des informations détaillées.

Vous souhaitez souvent désallouer les objets qui vivent dans un fil d'exécution lorsque celui-ci se termine. Pour ce faire, connectez le signal finished() à QObject::deleteLater().

Utilisez wait() pour bloquer le thread appelant, jusqu'à ce que l'autre thread ait terminé son exécution (ou jusqu'à ce qu'un certain temps se soit écoulé).

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

Remarque : les fonctionswait() et sleep() devraient être inutiles en général, puisque Qt est un cadre événementiel. Au lieu de wait(), vous pouvez envisager 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 fil d'exécution ; la seconde renvoie un pointeur QThread.

Pour choisir le nom qui sera donné à votre thread (tel qu'identifié par la commande ps -L sous Linux, par exemple), vous pouvez appeler setObjectName() avant de démarrer le thread. Si vous n'appelez pas setObjectName(), le nom donné à votre thread sera le nom de 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 QThread). Notez que ceci n'est actuellement pas disponible avec les versions de Windows.

Voir aussi Multi-threading dans Qt, QThreadStorage, Synchronisation des threads, Mandelbrot, Producer and Consumer using Semaphores, et Producer and Consumer using Wait Conditions.

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::IdlePriority0programmé uniquement lorsqu'aucun autre thread n'est en cours d'exécution.
QThread::LowestPriority1programmé moins souvent que LowPriority.
QThread::LowPriority2programmé moins souvent que NormalPriority.
QThread::NormalPriority3priorité par défaut du système d'exploitation.
QThread::HighPriority4programmé plus souvent que NormalPriority.
QThread::HighestPriority5programmé plus souvent que HighPriority.
QThread::TimeCriticalPriority6planifié aussi souvent que possible.
QThread::InheritPriority7utilise la même priorité que le thread en cours de création. Il s'agit de la priorité 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 à l'ordonnanceur des informations sur le type de travail effectué par le thread. Sur les plates-formes dotées de différents profils de CPU ou de la possibilité de réduire l'horloge de certains cœurs d'un CPU, cela permet à l'ordonnanceur de sélectionner ou de configurer un cœur de CPU présentant des caractéristiques de performance et d'énergie appropriées pour le thread.

ConstanteValeurDescription
QThread::QualityOfService::Auto0La valeur par défaut, qui laisse au programmateur le soin de décider sur quel cœur de processeur le thread doit être exécuté.
QThread::QualityOfService::High1Le programmateur doit exécuter ce thread sur un cœur de CPU à haute performance.
QThread::QualityOfService::Eco2Le planificateur doit exécuter ce thread sur un cœur de processeur à faible consommation d'énergie.

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

Voir aussi Priority, serviceLevel(), et QThreadPool::serviceLevel().

Documentation des fonctions membres

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

Construit un nouveau QThread pour gérer un nouveau thread. L'adresse parent devient propriétaire du QThread. Le thread ne commence pas à s'exécuter tant que start() n'est pas appelé.

Voir également start().

[virtual noexcept] QThread::~QThread()

Détruit l'objet QThread.

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

Depuis Qt 6.3, il est permis de supprimer une instance 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 XML enverra une demande d'interruption à ce thread (via requestInterruption()) ; demandera à la boucle d'événements du thread (s'il y en a une) de quitter (via quit()) ; et se bloquera 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 démarré - 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.

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

Voir aussi start().

[static] QThread *QThread::currentThread()

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

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

Renvoie l'identifiant du thread en cours d'exécution.

Attention : L'identifiant 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 le DWORD (Windows-Thread ID) renvoyé par la fonction Win32 GetCurrentThreadId(), et non le pseudo-HANDLE (Windows-Thread HANDLE) 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 de distribution d'événements pour le thread. S'il n'existe pas de distributeur d'événements pour le thread, cette fonction renvoie nullptr.

Voir également setEventDispatcher().

[protected] int QThread::exec()

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

Cette fonction est destinée à être appelée à partir de run(). Il est nécessaire d'appeler cette fonction pour commencer le traitement des événements.

Remarque : cette fonction ne peut être appelée qu'à l'intérieur du thread lui-même, c'est-à-dire lorsqu'il s'agit du thread en cours.

Voir également quit() et exit().

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

Indique à la boucle événementielle du thread de sortir avec un code de retour.

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

Par convention, un returnCode de 0 signifie un succès, toute valeur non nulle indique une erreur.

Notez que , contrairement à la fonction du même nom de la bibliothèque C, cette fonction renvoie à l'appelant - c'est le traitement de l'événement qui s'arrête.

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

Remarque : cette fonction est à l'épreuve des threads.

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 s'est déjà arrêtée. Plus aucun événement ne sera traité dans le fil d'exécution, à l'exception des événements de suppression différée. Ce signal peut être connecté à QObject::deleteLater(), pour libérer des objets dans ce thread.

Remarque : si le thread associé a été terminé à l'aide de 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 aussi 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, elle interroge le nombre de processeurs logiques disponibles pour ce processus (s'il est pris en charge par ce système d'exploitation) ou le nombre total de processeurs logiques dans le système. Cette fonction renvoie 1 si aucune valeur n'a pu être déterminée.

Note : Sur les systèmes d'exploitation qui permettent de définir l'affinité d'un thread avec un sous-ensemble de tous les processeurs logiques, la valeur renvoyée par cette fonction peut changer d'un thread à l'autre et au fil du temps.

Note : Sur les systèmes d'exploitation qui supportent le hotplugging et le hot-unplugging du CPU, la valeur retournée par cette fonction peut également changer avec le temps (et notez que les CPU peuvent être activés et désactivés par logiciel, sans modification physique du matériel).

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

Retourne true si ce thread est QThread::currentThread.

Cette fonction a été introduite dans Qt 6.8.

Voir aussi 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 que le signal finished() a été émis.

Notez que le thread peut encore s'exécuter pendant une durée arbitraire après l'émission du signal finished(), en effectuant des opérations de nettoyage telles que l'exécution des destructeurs des variables thread_local. Pour se synchroniser avec tous les effets du thread, appelez wait() et vérifiez qu'il a renvoyé true.

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

Voir aussi isRunning().

bool QThread::isInterruptionRequested() const

Retourne true si la tâche en cours d'exécution sur ce thread doit être arrêtée. Une interruption peut être demandée par requestInterruption().

Cette fonction peut être utilisée pour rendre les tâches de longue durée proprement interruptibles. Ne jamais vérifier ou agir sur la valeur renvoyée par cette fonction est sûr, mais il est conseillé de le faire régulièrement dans les fonctions qui s'exécutent depuis longtemps. Veillez à ne pas l'appeler trop souvent, afin de maintenir l'overhead à un niveau bas.

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 en cours.

Voir aussi 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 le thread dans lequel QCoreApplication a été créé. Il s'agit généralement du thread qui a appelé la fonction main(), mais pas nécessairement. C'est le thread qui traite les événements de l'interface graphique et dans lequel les objets graphiques (QWindow, QWidget) peuvent être créés.

Cette fonction a été introduite dans Qt 6.8.

Voir aussi currentThread() et QCoreApplication::instance().

bool QThread::isRunning() const

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

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

Notez que le thread peut encore s'exécuter pendant une durée arbitraire après l'émission du signal finished(), en effectuant des opérations de nettoyage telles que l'exécution des destructeurs des variables thread_local. Pour se synchroniser avec tous les effets du thread, appelez wait() et vérifiez qu'il a renvoyé true.

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

Voir aussi isFinished().

int QThread::loopLevel() const

Renvoie le niveau actuel de la boucle d'événements pour le fil d'exécution.

Remarque : cette fonction ne peut être appelée qu'à l'intérieur du thread lui-même, c'est-à-dire lorsqu'il s'agit du thread en cours.

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

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

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

Remarque : cette fonction ne garantit pas la précision. L'application peut dormir plus longtemps que msecs dans des conditions de forte charge. Certains systèmes d'exploitation peuvent arrondir msecs à 10 ms ou 15 ms.

Voir aussi 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 quitter avec le code de retour 0 (succès). Cela équivaut à appeler QThread::exit(0).

Cette fonction ne fait rien si le thread n'a pas de boucle d'événements.

Remarque : cette fonction est sans danger pour les threads.

Voir aussi exit() et QEventLoop.

void QThread::requestInterruption()

Demander l'interruption du fil de discussion. Cette demande est consultative et c'est au code s'exécutant sur le fil de décider si et comment il doit agir en fonction de cette demande. Cette fonction n'arrête aucune boucle d'événements en cours d'exécution sur le thread et ne le termine en aucune façon.

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 sans danger pour les threads.

Voir également isInterruptionRequested().

[virtual protected] void QThread::run()

Le point de départ du fil de discussion. Après avoir appelé start(), le nouveau fil de discussion appelle cette fonction. L'implémentation par défaut appelle simplement exec().

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

Voir également start() et wait().

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

Renvoie le niveau de qualité de service actuel du thread.

Cette fonction a été introduite dans Qt 6.9.

Voir aussi setServiceLevel() et QThreadPool::serviceLevel().

void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)

Définit le distributeur d'événements pour le thread à eventDispatcher. Cela n'est possible que si aucun distributeur d'événements n'est encore installé pour le thread.

Un distributeur d'événements est automatiquement créé pour le thread principal lors de l'instanciation de QCoreApplication et sur start() pour les threads auxiliaires.

Cette méthode prend possession de l'objet.

Voir aussi eventDispatcher().

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

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

L'argument priority peut être 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, le paramètre priority sera ignoré sur les systèmes qui ne prennent pas en charge les priorités des threads (comme sous Linux, voir http://linux.die.net/man/2/sched_setscheduler pour plus de détails).

Voir aussi Priority, priority(), et start().

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

Fixe le niveau de qualité de service de l'objet thread à serviceLevel. Cette fonction ne peut être appelée qu'à partir du thread lui-même ou avant que le thread ne soit démarré !

Cette fonction n'est actuellement mise en œuvre que sur les plates-formes Apple et Windows. L'appel de la fonction s'effectuera avec succès sur d'autres plateformes, mais n'aura aucun effet pour le moment.

Cette fonction a été introduite dans Qt 6.9.

Voir aussi serviceLevel() et QThreadPool::setServiceLevel().

void QThread::setStackSize(uint stackSize)

Définit la taille de la pile pour le thread à stackSize. Si stackSize est zéro, le système d'exploitation ou le runtime choisira une valeur par défaut. Sinon, la taille de la pile du thread sera la valeur fournie (qui peut être arrondie vers le haut ou vers le bas).

Sur la plupart des systèmes d'exploitation, la quantité de mémoire allouée à la pile sera initialement inférieure à stackSize et augmentera au fur et à mesure que le thread utilisera la pile. Ce paramètre définit la taille maximale de la pile (c'est-à-dire la taille de l'espace mémoire virtuel que la pile est autorisée à occuper).

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

Attention : La plupart des systèmes d'exploitation imposent des limites minimales et maximales à la taille de la pile des threads. Le thread ne démarrera pas si la taille de la pile est en dehors de ces limites.

Voir également stackSize().

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

Active ou désactive la fin de la discussion en cours en fonction du paramètre enabled. La discussion doit avoir été lancée par QThread.

Lorsque enabled est faux, la terminaison est désactivée. Les futurs appels à QThread::terminate() reviendront immédiatement sans effet. Au lieu de cela, la terminaison est différée jusqu'à ce que la terminaison soit activée.

Lorsque enabled est vrai, la terminaison est activée. Les prochains appels à QThread::terminate() mettront fin au thread normalement. Si la terminaison a été différée (c'est-à-dire que QThread::terminate() a été appelé alors que la terminaison était désactivée), cette fonction terminera immédiatement le thread appelant. Notez que cette fonction ne renvoie pas dans ce cas.

Voir aussi terminate().

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

Force le thread en cours à dormir pendant nsecs.

Évitez d'utiliser cette fonction si vous devez attendre qu'une condition donnée change. Au lieu de cela, connectez un slot au signal qui indique le changement ou utilisez un gestionnaire d'événements (voir QObject::event()).

Remarque : cette fonction ne garantit pas la précision. L'application peut dormir plus longtemps que nsecs dans des conditions de forte charge.

Cette fonction a été introduite dans Qt 6.6.

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

Force le thread en cours à dormir pendant secs secondes.

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

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

Voir aussi msleep() et usleep().

uint QThread::stackSize() const

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

Voir aussi setStackSize().

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

Commence l'exécution du thread en appelant run(). Le système d'exploitation planifie l'exécution du thread en fonction du 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 d'ordonnancement du système d'exploitation. En particulier, le paramètre priority sera ignoré sur les systèmes qui ne prennent pas en charge les priorités des threads (comme sous Linux, voir la documentation sched_setscheduler pour plus de détails).

Voir aussi run() et terminate().

[private signal] void QThread::started()

Ce signal est émis par le thread associé lorsqu'il commence à s'exécuter, de sorte que tous les slots qui lui sont connectés peuvent être appelés par le biais d'une invocation en file d'attente. Bien que l'événement puisse avoir été posté avant que run() ne soit appelé, toute 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 aussi run() et finished().

[slot] void QThread::terminate()

Termine l'exécution du thread. Le thread peut être terminé immédiatement ou non, en fonction de la politique d'ordonnancement du système d'exploitation. Pour vous en assurer, utilisez QThread::wait() après terminate().

Lorsque le thread est terminé, tous les threads qui attendent la fin du thread sont réveillés.

Attention : Cette fonction est dangereuse et son utilisation est déconseillée. Le thread peut être terminé à n'importe quel moment de son parcours de code. Les threads peuvent être interrompus pendant qu'ils modifient des données. Le thread n'a aucune chance de nettoyer après lui, de déverrouiller les mutex qu'il détient, etc. En bref, 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 à cette fonction alors que la terminaison est désactivée a pour effet de différer la terminaison jusqu'à ce qu'elle soit réactivée. Voir 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 :

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

Remarque : cette fonction ne garantit pas la précision. L'application peut dormir plus longtemps que usecs dans des conditions de forte charge. Certains systèmes d'exploitation peuvent arrondir usecs à 10 ms ou 15 ms ; sous Windows, il sera arrondi à 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 de ces conditions soit remplie :

  • Le thread associé à cet objet QThread a terminé son exécution (c'est-à-dire lorsqu'il revient de run()). Cette fonction renvoie un message vrai si l'exécution de la discussion est terminée. Elle renvoie également un résultat positif si la discussion n'a pas encore été lancée.
  • L'échéance deadline est atteinte. Cette fonction renvoie un message faux si l'échéance est atteinte.

Un timer de date limite réglé sur QDeadlineTimer::Forever (par défaut) n'est jamais dépassé : dans ce cas, la fonction ne revient que lorsque le thread revient de run() ou si le thread n'a pas encore démarré.

Cette fonction est similaire à la fonction POSIX pthread_join().

Remarque : sur certains systèmes d'exploitation, cette fonction peut renvoyer un message vrai alors que le thread du système d'exploitation est toujours en cours d'exécution et qu'il exécute un code de nettoyage tel que les destructeurs C++11 thread_local. Les systèmes d'exploitation pour lesquels cette fonction ne renvoie un message vrai qu'une fois que le fil d'exécution du système d'exploitation est complètement terminé sont les systèmes d'exploitation Linux, Windows et Apple.

Voir également sleep() et terminate().

bool QThread::wait(unsigned long time)

time est le temps d'attente en millisecondes. Si time est ULONG_MAX, le délai d'attente ne sera jamais dépassé.

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

[static] void QThread::yieldCurrentThread()

Transfère l'exécution du thread actuel à un autre thread exécutable, s'il y en a un. Notez que c'est le système d'exploitation qui décide vers quelle 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.