Heim > Backend-Entwicklung > C++ > Wie führe ich einen Funktor oder Lambda in einem bestimmten Qt-Thread aus?

Wie führe ich einen Funktor oder Lambda in einem bestimmten Qt-Thread aus?

Linda Hamilton
Freigeben: 2024-12-17 04:07:25
Original
743 Leute haben es durchsucht

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

So führen Sie einen Funktor oder einen Lambda in einem bestimmten Thread in Qt aus

In Qt ist es möglich, einen Lambda oder einen Funktor in einem bestimmten Thread auszuführen mit Metacall-Beitrag. So geht's:

  1. Erstellen Sie ein Funktoid, um die auszuführende Funktion einzuschließen:
    Übergeben Sie die auszuführende Funktion als Argument an den std: :Funktionsklasse wie gezeigt:

     std::function<void()> myFunction = []() {
     // Code to be executed in the specified thread
    };
    Nach dem Login kopieren
  2. Posten Sie den Metaaufruf an den angegebenen Thread:
    Verwenden Sie die postMetaCall-Funktion aus dem FunctorCallConsumer-Namespace, um den Metaaufruf an den gewünschten Thread zu senden. Die Funktion benötigt einen Thread-Zeiger und einen Funktionszeiger als Argumente.

    FunctorCallConsumer::postMetaCall(&myThread, myFunction);
    Nach dem Login kopieren
    • Hinweis:
      In Qt 5.10 und höher können Sie QMetaObject::invokeMethod direkt verwenden eine Funktion in einem angegebenen ausführen Thread:
    QMetaObject::invokeMethod(&myThread, myFunction);
    Nach dem Login kopieren
  3. Implementieren Sie einen Metacall-Ereigniskonsumenten:
    Der letzte Schritt besteht darin, eine QEvent-Unterklasse zu implementieren, die das empfängt und ausführt Metaaufruf. Die FunctorCallEvent-Klasse kann wie folgt definiert werden:

    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;
    };
    
    Nach dem Login kopieren
  4. Verbinden Sie den Ereigniskonsumenten mit dem Thread:
    Sobald die FunctorCallEvent-Klasse definiert wurde, stellen Sie eine Verbindung her Fügen Sie es der Ereignisschleife des angegebenen Threads hinzu QCoreApplication::installEventFilter.

    QCoreApplication::instance()->installEventFilter(new FunctorCallEventConsumer(&myThread));
    Nach dem Login kopieren

Beispiel:
Hier ist ein vollständiges Beispiel, das zeigt, wie ein Lambda in einem bestimmten Thread ausgeführt wird:

#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();
}
Nach dem Login kopieren

Ausgabe:

Lambda executed in thread QThread(0x7f8632802640, name = "MyThread")
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie führe ich einen Funktor oder Lambda in einem bestimmten Qt-Thread aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage