> 백엔드 개발 > C++ > 특정 Qt 스레드에서 Functor 또는 Lambda를 실행하는 방법은 무엇입니까?

특정 Qt 스레드에서 Functor 또는 Lambda를 실행하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-17 04:07:25
원래의
743명이 탐색했습니다.

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

Qt의 특정 스레드에서 펑터 또는 람다를 실행하는 방법

Qt에서는 다음을 사용하여 특정 스레드에서 람다 또는 펑터를 실행할 수 있습니다. 메타콜 게시. 수행 방법은 다음과 같습니다.

  1. 실행할 함수를 래핑하는 펑토이드를 만듭니다:
    실행할 함수를 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));
    로그인 후 복사

:
다음은 지정된 스레드에서 람다를 실행하는 방법을 보여주는 전체 예입니다.

#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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿