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

如何在特定的 Qt 线程中执行 Functor 或 Lambda,类似于 GCD?

DDD
发布: 2024-12-16 18:35:12
原创
131 人浏览过

How to Execute Functors or Lambdas in a Specific Qt Thread, Similar to GCD?

如何在 Qt、GCD 风格的给定线程中执行 Functor 或 Lambda?

问题:

在 Qt 中,您希望在任何具有事件循环的线程中执行 lambda 或仿函数,类似于Objective-C 中的 GCD 调度队列。

解决方案:

解决方案的核心是传递一个事件,将函子包装到驻留在所需线程中的消费者对象。此操作称为 元调用发布,可以通过多种方式实现。

Qt 5.10 及以上 TL;DR:

您可以调用 QObject 或 QThread 上的方法直接:

// Invoke on the main thread
QMetaObject::invokeMethod(qApp, []{ ... });

// Invoke on an object's thread
QMetaObject::invokeMethod(obj, []{ ... });

// Invoke on a particular thread
QMetaObject::invokeMethod(
    QAbstractEventDispatcher::instance(thread),
    []{ ... });
登录后复制

TL;函子的DR:

提供了几个模板函数来将函子包装在适当的事件对象中,使元调用发布变得方便。

// Post to the main thread sync
void execInMainThread_sync(std::function<void(void)> func) {
    if(qApp->thread() == QThread::currentThread())
        func();
    else {
        ((App*) qApp)->invokeGenericExec(func, Qt::BlockingQueuedConnection);
    }
}

// Post to the main thread async
void execInMainThread_async(std::function<void(void)> func) {
    ((App*) qApp)->invokeGenericExec(func, Qt::QueuedConnection);
}
登录后复制

TL;DR方法/槽:

对于方法或槽,定义一个宏来处理元调用发布。

#define POST_METHOD(obj, method) \
    QObject src; \
    QObject::connect(&src, &QObject::destroyed, obj, method, \
                       Qt::QueuedConnection);
登录后复制

通用代码:

提供的代码包括常见的辅助函数和宏,它们抽象了元调用发布实现以在不同的环境中使用

示例:

void test1() {
    QThread t;
    QObject o;
    o.moveToThread(&t);

    // Execute in given object's thread
    postToObject([&]{ o.setObjectName("hello"); }, &o);
    // or
    postToObject(std::bind(&QObject::setObjectName, &o, "hello"), &o);

    // Execute in given thread
    postToThread([]{ qDebug() << "hello from worker thread"; });

    // Execute in the main thread
    postToThread([]{ qDebug() << "hello from main thread"; });
}
登录后复制

附加说明:

如果您的目标线程没有事件循环例如工作线程,您可能需要一种机制来启动线程内的事件循环。例如,如果使用单次计时器进行元调用发布,则可以使用 QThread::exec() 启动事件循环。

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

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