首页 > 后端开发 > C++ > 如何在特定的 Qt 线程中执行 Functor 或 Lambda?

如何在特定的 Qt 线程中执行 Functor 或 Lambda?

Linda Hamilton
发布: 2024-12-17 04:07:25
原创
752 人浏览过

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

如何在 Qt 中的给定线程中执行函子或 lambda

在 Qt 中,可以使用以下命令在特定线程中执行 lambda 或函子元呼叫发布。其实现方式如下:

  1. 创建一个 functoid 来包装要执行的函数
    将要执行的函数作为参数传递给 std: : 函数类为显示:

    1

    2

    3

    std::function<void()> myFunction = []() {

     // Code to be executed in the specified thread

    };

    登录后复制
  2. 将元调用发布到指定线程
    使用 FunctorCallConsumer 命名空间中的 postMetaCall 函数将元调用发布到所需的线程。该函数接受一个线程指针和一个函数指针作为参数。

    1

    FunctorCallConsumer::postMetaCall(&myThread, myFunction);

    登录后复制
    • 注意
      在Qt 5.10及更高版本中,可以直接使用QMetaObject::invokeMethod在指定的位置执行一个函数thread:

    1

    QMetaObject::invokeMethod(&myThread, myFunction);

    登录后复制
  3. 实现元调用事件消费者:
    最后一步是实现一个 QEvent 子类,它将接收并执行元调用。 FunctorCallEvent 类可以定义如下:

    1

    2

    3

    4

    5

    6

    7

    8

    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.

    1

    QCoreApplication::instance()->installEventFilter(new FunctorCallEventConsumer(&myThread));

    登录后复制

示例:
这是一个完整的示例,演示如何在指定线程中执行 lambda:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#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();

}

登录后复制

输出:

1

Lambda executed in thread QThread(0x7f8632802640, name = "MyThread")

登录后复制

以上是如何在特定的 Qt 线程中执行 Functor 或 Lambda?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板