Maison > développement back-end > C++ > Comment exécuter un foncteur ou Lambda dans un thread Qt spécifique ?

Comment exécuter un foncteur ou Lambda dans un thread Qt spécifique ?

Linda Hamilton
Libérer: 2024-12-17 04:07:25
original
747 Les gens l'ont consulté

How to Execute a Functor or Lambda in a Specific Qt Thread?

Comment exécuter un foncteur ou un lambda dans un thread donné dans Qt

Dans Qt, il est possible d'exécuter un lambda ou un foncteur dans un thread spécifique en utilisant publication de méta-appels. Voici comment procéder :

  1. Créez un fonctoïde pour envelopper la fonction à exécuter :
    Passez la fonction à exécuter en argument au std : :classe de fonction comme indiqué :

     std::function<void()> myFunction = []() {
     // Code to be executed in the specified thread
    };
    Copier après la connexion
  2. Publier le méta-appel au fil spécifié :
    Utilisez la fonction postMetaCall de l'espace de noms FunctorCallConsumer pour publier le méta-appel sur le fil souhaité. La fonction prend un pointeur de thread et un pointeur de fonction comme arguments.

    FunctorCallConsumer::postMetaCall(&myThread, myFunction);
    Copier après la connexion
    • Remarque :
      Dans Qt 5.10 et versions ultérieures, vous pouvez directement utiliser QMetaObject::invokeMethod pour exécuter une fonction dans un délai spécifié fil :
    QMetaObject::invokeMethod(&myThread, myFunction);
    Copier après la connexion
  3. Implémenter un consommateur d'événement métacall:
    La dernière étape consiste à implémenter une sous-classe QEvent qui recevra et exécutera le métaappel. La classe FunctorCallEvent peut être définie comme suit :

    class FunctorCallEvent : public QEvent {
    public:
     FunctorCallEvent(std::function<void()> fun) : QEvent(QEvent::None), m_fun(fun) {}
     void execute() { m_fun(); }
    
    private:
     std::function<void()> m_fun;
    };
    
    Copier après la connexion
  4. Connectez le consommateur d'événement au thread :
    Une fois la classe FunctorCallEvent définie, connectez-vous à la boucle d'événements du thread spécifié en utilisant QCoreApplication::installEventFilter.

    QCoreApplication::instance()->installEventFilter(new FunctorCallEventConsumer(&myThread));
    Copier après la connexion

Exemple:
Voici un exemple complet qui montre comment exécuter un lambda dans un thread spécifié :

#include <QtCore>

class MyThread : public QThread {
public:
    void run() override {
        // Execute the lambda in this thread
        m_lambda();
    }

    void setLambda(std::function<void()> lambda) {
        m_lambda = lambda;
    }

private:
    std::function<void()> m_lambda;
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // Create a new thread
    MyThread thread;

    // Create a lambda to execute in the thread
    std::function<void()> lambda = []() {
        qDebug() << "Lambda executed in thread" << QThread::currentThread();
    };

    // Set the lambda on the thread
    thread.setLambda(lambda);

    // Start the thread
    thread.start();

    return app.exec();
}
Copier après la connexion

Sortie :

Lambda executed in thread QThread(0x7f8632802640, name = "MyThread")
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal