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
Linda HamiltonOriginal
2024-12-17 04:07:25750Durchsuche

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

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

Ausgabe:

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

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!

Stellungnahme:
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