In Qt ist es möglich, einen Lambda oder einen Funktor in einem bestimmten Thread auszuführen mit Metacall-Beitrag. So geht's:
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 };
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);
QMetaObject::invokeMethod(&myThread, myFunction);
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; };
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!