gpt4 book ai didi

c++ - 是否可以从渲染线程强制执行主线程(GUI线程)?

转载 作者:行者123 更新时间:2023-12-03 06:57:11 25 4
gpt4 key购买 nike

我们有在渲染线程中直接在QQuickWindow::beforeRenderingQQuickWindow::afterRendering之间执行的命令队列,命令对数据模型进行更改,并且当数据模型发生变化时更改后它会立即通知我们的自定义 OpenGL 渲染引擎同步数据。

问题是当数据模型发生变化时,它也会通知想要更新 UI 的订阅者。但从不同线程更新 UI 是容易出错的方法。一种方法是使用Qt::QueuedConnection。这也很容易出错,因为执行时模型可能会进入远状态。

设计与此非常相似example .

例如,是否可以从渲染线程更新与 QML 链接的 QStadardItemModel

最佳答案

这是可能的,你可以用QMetaObject::invokeMethod(QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)来做到这一点QMetaObject::invokeMethod 的重载。

对于上下文,您需要传递一个存在于要运行函数的线程上的对象。对于 GUI 线程,QCoreApplication::instance() 是一个不错的选择。对于连接类型,根据您的需要(无论您是否需要阻止调用)使用 Qt::QueueConnectionQt::BlockingQueuedConnection。如果您使用的是Qt::BlockingQueuedConnection,请确保您当前不在主线程中(如果是的话,您可以进行检查并通过Qt::DirectConnection)案例)。

对于仿函数,lambda 就可以了。

示例:

qDebug() << "1 main thread" << QThread::currentThreadId();
QtConcurrent::run([] {
qDebug() << "1 QtConcurrent thread" << QThread::currentThreadId();

QMetaObject::invokeMethod(QCoreApplication::instance(), [] {
qDebug() << "invokeMethod thread" << QThread::currentThreadId();
}, Qt::BlockingQueuedConnection);

qDebug() << "2 QtConcurrent thread" << QThread::currentThreadId();
});
qDebug() << "2 main thread" << QThread::currentThreadId();

输出:

1 main thread 0x1c7c
2 main thread 0x1c7c
1 QtConcurrent thread 0x19ec
invokeMethod thread 0x1c7c
2 QtConcurrent thread 0x19ec

关于c++ - 是否可以从渲染线程强制执行主线程(GUI线程)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63961507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com