ホームページ > バックエンド開発 > C++ > 特定の Qt スレッドでファンクターまたはラムダを実行するにはどうすればよいですか?

特定の Qt スレッドでファンクターまたはラムダを実行するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-17 04:07:25
オリジナル
743 人が閲覧しました

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

Qt の特定のスレッドでファンクターまたはラムダを実行する方法

Qt では、次を使用して特定のスレッドでラムダまたはファンクターを実行できます。メタコールの投稿。その方法は次のとおりです。

  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. メタコール イベント コンシューマを実装する:
    最後のステップは、メタコール。 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));
    ログイン後にコピー

Example:
指定されたスレッドでラムダを実行する方法を示す完全な例を次に示します。

#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 スレッドでファンクターまたはラムダを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート