首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自运行QML QtQuick2引擎的不同线程的QtQuick2模型更新的行为

来自运行QML QtQuick2引擎的不同线程的QtQuick2模型更新的行为
EN

Stack Overflow用户
提问于 2015-07-28 07:50:14
回答 1查看 1.3K关注 0票数 3

该设想包括以下几个组成部分:

  • 在主线程中创建的C++ QAbstractItemModel派生模型类
  • 在主线程中实例化QML QtQuick2引擎
  • Worker boost::用户交互时主线程生成的线程

这些组成部分之间的关系:

  • C++模型是通过向qmlRegisterSingletonType<>()注册的Q_PROPERTY向QML引擎公开的。
  • 工作线程通过调用“data_changed(.)”的方法更新模型

问题:“data_changed(.)”的回调在哪个线程中进行发生了什么?

Note

这个问题的一个关键因素是已启动的线程不知道qt。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-28 12:37:57

我假设工作线程在某些QObject上调用一个信号方法。这是完全线程安全的,也是一件有效的事情。信号的实现将当前线程与每个插槽的线程进行比较,并确定使用何种连接(如果连接是自动类型的)。

只要使用自动连接或排队连接连接到所述信号,插槽就会在其QObject实例的QObject中被调用。

在哪个线程中调用信号并不重要,该线程是否是Qt线程也不重要。

如果将上下文对象提供给到函子的连接,函子将在上下文对象的线程中执行,因此可以通过以下方式对对象执行线程安全函式调用:)

例如:

代码语言:javascript
复制
#include <QtCore>
#include <thread>

class Object : public QObject {
  Q_OBJECT
public:
  Q_SIGNAL void ping();
  Q_SLOT void pong() { 
    qDebug() << "hello on thread" << QThread::currentThread();
    qApp.quit();
  });
};

int main(int argc, char ** argv) {
  QCoreApplication app(argc, argv);
  Object obj;
  qDebug() << "main thread is" << QThread::currentThread();
  QObject::connect(&obj, &Object::ping, &obj, &Object:pong);
  QObject::connect(&obj, &Object::ping, []{
    qDebug() << "context-free functor invoked on thread" << QThread::currentThread();
  });
  QObject::connect(&obj, &QObject::ping, &obj, []{
    qDebug() << "context-ful functor invoked on thread" << QThread::currentThread();
  });
  auto thread = std::thread([&obj]{
    emit obj.ping();
  });
  int rc = app.exec();
  thread.join();
  return rc;
}
#include "main.moc"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31670368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档