Qt에서는 다음을 사용하여 특정 스레드에서 람다 또는 펑터를 실행할 수 있습니다. 메타콜 게시. 수행 방법은 다음과 같습니다.
실행할 함수를 래핑하는 펑토이드를 만듭니다:
실행할 함수를 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));
예:
다음은 지정된 스레드에서 람다를 실행하는 방법을 보여주는 전체 예입니다.
#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!