簡體   English   中英

從運行QML QtQuick2引擎的不同線程更新c ++模型的行為

[英]Behaviour of a c++ model update from a different thread from which the QML QtQuick2 engine is running

該方案具有以下組件:

  • C ++ QAbstractItemModel派生在主線程中創建的模型類
  • QML QtQuick2引擎在主線程中實例化
  • 在用戶交互時,從主線程生成的worker boost :: thread

這些組件之間的關系:

  • C ++模型通過qmlRegisterSingletonType <>()注冊的類型的Q_PROPERTY公開給QML引擎。
  • 工作線程通過調用“emit data_changed(...)”的方法更新模型

問題:在哪個線程中發生“emit data_changed(...)”的回調?

注意

這個問題的一個關鍵因素是啟動的線程不是qt意識。

我假設工作線程在某些QObject上調用信號方法。 這是完全線程安全的,也是一件有效的事情。 信號的實現將當前線程與每個槽的線程進行比較,並確定要使用的連接類型(如果連接是自動類型)。

只要使用自動或排隊連接連接到所述信號,就會在其QObject實例的thread()中調用這些插槽。

調用信號的線程並不重要,並且該線程是否是Qt線程無關緊要。

如果你為一個仿函數的連接提供了一個上下文對象,那么仿函數將在上下文對象的線程中執行,這樣你就可以對對象進行線程安全的仿函數調用:)

例如:

#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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM