Qt では、次を使用して特定のスレッドでラムダまたはファンクターを実行できます。メタコールの投稿。その方法は次のとおりです。
実行する関数をラップする Functoid を作成します:
実行する関数を引数として std に渡します。 :関数クラスとして表示:
std::function<void()> myFunction = []() { // Code to be executed in the specified thread };
指定されたスレッドにメタコールをポストします:
FunctorCallConsumer 名前空間の postMetaCall 関数を使用して、メタコールを目的のスレッドにポストします。この関数は、スレッド ポインタと関数ポインタを引数として受け取ります。
FunctorCallConsumer::postMetaCall(&myThread, myFunction);
QMetaObject::invokeMethod(&myThread, myFunction);
メタコール イベント コンシューマを実装する:
最後のステップは、メタコール。 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));
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 サイトの他の関連記事を参照してください。