簡體   English   中英

qml c ++屬性綁定多個線程

[英]qml c++ property bindings with multiple threads

我正在創建一個模塊化應用程序 它有一個Core和一些模塊,其中有一個gui模塊。 可以通過命令行啟動這些模塊:

myApp gui=qml=qmlFile.qml connection=serial=/dev/ttyS1

將使用一個(多個也可能)gui和一個串行連接啟動應用程序。 總有一個Router對象處理連接。 Guis由一個看起來像這樣的類加載:

class Gui :QObject{
  Core* core;
  public:
  QQmlApplicationEngine engine;
  public slots:
  void start(){
    engine.load("qrc:/gui/from/command/line.qml");
  }

在gui中我有一個很好的qml名為ConnectionController{} ,這是一種添加/刪除連接的簡單方法。 但這只是它的第一種:最終每個模塊都應該有一個用於控制它的qml組件。

這一切都很好,但現在我想添加多個線程。 我想要一個RouterThread和一個GuiThread 這本身只是將Router (由Core )的創建更改為:

m_router = new Router(this /*not as parent, just as pointer*/);
m_router->moveToThread(&routerThread);

(gui現在仍然存在於主線程中)此后一切仍然正常,除了qml屬性綁定。

QQmlEngine: Illegal attempt to connect to SerialConnection(0x7f58d00013a0) that is in a different thread than the QML engine

因為Gui和它的孩子QQmlEngine engine生活在guiThreadSerialConnection生活在routerThread
RouterGui (沒有qml)之間的信號和插槽確實有效,因為默認情況下它們被qt處理為異步。 (只要定義了適當的類型。)

好吧,不,你不能從你的gui訪問線程對象,不應該嘗試。

您需要構建一個c ++模型,該模型位於暴露給qml的主線程中。 在此模型中,您可以通過排隊連接連接線程發出的信號,並將它們鏈接到模型自身的信號。 此外,您應該確保當您從另一個線程擁有的對象讀取數據時,所有內容都是正確的互斥或您將閱讀垃圾。

暫無
暫無

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

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