在Qt 中,可以使用下列指令在特定執行緒中執行lambda 或函子元呼叫發布。其實作方式如下:
建立一個 functoid 來包裝要執行的函數:
將要執行的函數作為參數傳遞給 std: :函數類別為顯示:
std::function<void()> myFunction = []() { // Code to be executed in the specified thread };
將元呼叫發佈到指定執行緒:
使用FunctorCallConsumer 命名空間中的 postMetaCall 函數將元調用所需的線程。此函數接受一個線程指標和一個函數指標作為參數。
FunctorCallConsumer::postMetaCall(&myThread, myFunction);
QMetaObject::invokeMethod(&myThread, myFunction);
實現元呼叫事件消費者:
最後一步是實作一個QEvent 子類,它將接收並執行元呼叫。 FunctorCallEvent 類別可以定義如下:
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; };
將事件使用者連接到執行緒:
定義 FunctorCallEvent類別後,連接使用它到指定執行緒的事件循環QCoreApplication::installEventFilter.
QCoreApplication::instance()->installEventFilter(new FunctorCallEventConsumer(&myThread));
範例:
這是一個完整的範例,示範如何在指定執行緒執行lambda:
#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(); }
輸出:
Lambda executed in thread QThread(0x7f8632802640, name = "MyThread")
以上是如何在特定的 Qt 執行緒中執行 Functor 或 Lambda?的詳細內容。更多資訊請關注PHP中文網其他相關文章!