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
Linda Hamiltonoriginal
2024-12-17 04:07:25807parcourir

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

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

Sortie :

Lambda executed in thread QThread(0x7f8632802640, name = "MyThread")

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!

Déclaration:
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