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 :
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 };
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);
QMetaObject::invokeMethod(&myThread, myFunction);
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; };
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!