首頁 > 後端開發 > C++ > 如何在特定的 Qt 執行緒中執行 Functor 或 Lambda?

如何在特定的 Qt 執行緒中執行 Functor 或 Lambda?

Linda Hamilton
發布: 2024-12-17 04:07:25
原創
742 人瀏覽過

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

如何在Qt 中的給定執行緒中執行函子或lambda

在Qt 中,可以使用下列指令在特定執行緒中執行lambda 或函子元呼叫發布。其實作方式如下:

  1. 建立一個 functoid 來包裝要執行的函數
    將要執行的函數作為參數傳遞給 std: :函數類別為顯示:

     std::function<void()> myFunction = []() {
     // Code to be executed in the specified thread
    };
    登入後複製
  2. 將元呼叫發佈到指定執行緒
    使用FunctorCallConsumer 命名空間中的 postMetaCall 函數將元調用所需的線程。此函數接受一個線程指標和一個函數指標作為參數。

    FunctorCallConsumer::postMetaCall(&myThread, myFunction);
    登入後複製
    • 注意
      在Qt 5.10以上版本中,可以直接使用QMetaObject::invokeMethod在指定的位置執行一個函數thread:
    QMetaObject::invokeMethod(&myThread, myFunction);
    登入後複製
  3. 實現元呼叫事件消費者:
    最後一步是實作一個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;
    };
    
    登入後複製
  4. 將事件使用者連接到執行緒
    定義 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板