Qt QML - QModBus lire corrompu par QML BusyIndicator/Animation - SingleThread

0

La question

J'ai un seul thread QQuick application avec une fenêtre principale et une classe qui gère Modbus Lecture/Écriture de fonctions. Tout fonctionne bien jusqu'à présent, mais quand je mets un BusyIndicator dans mon qml fenêtre pour montrer que le Bus est occupé-je obtenir CRC les inadéquations et les délais de réponse, par exemple:

  • "Rejet de l'intervention avec le mauvais CRC, reçues: 64580 , le CRC calculé: 55067"
  • "Lire la réponse d'erreur: délai de Réponse. (code: 0 x 5)" - qt.modbus: (RTU client) Ne peut pas correspondre à la réponse avec demande d'ouverture, en ignorant

Le ReadRequest est envoyé via

void ModbusDevice::readData(int serveraddress, int startaddress, int cnt) {
QModbusDataUnit RxData;

if(startaddress>=HOLDING_BASE) RxData.setRegisterType(QModbusDataUnit::HoldingRegisters);
else RxData.setRegisterType(QModbusDataUnit::InputRegisters);

RxData.setStartAddress(startaddress);
RxData.setValueCount(cnt);

if (auto *reply = m_ModbusClient->sendReadRequest(RxData, serveraddress)) {
    connect(reply, &QModbusReply::finished, this, &CellDevice::InterruptHandler);
else qDebug() << m_ModbusClient->errorString();
}

Si il n'y a pas d'animation en cours d'exécution dans ma fenêtre, de la réception des données sans erreurs.

  • Cela peut-il être résolu en utilisant un thread séparé pour exécuter le modbus lecture/écriture des méthodes et comment puis-je la mettre? Ou aurais-je seulement d'augmenter les interprète mal par la mise en Série des fonctions dans un Thread séparé?

Comme je l'ai entendu jusqu'à présent, en raison du fait que ma demande est donc la mesure d'exécution dans un seul thread, la mise à jour en continu de l'interface graphique est en quelque sorte interférer avec la réception de Données en Série.

J'ai utilisé la ligne de commande linux outil de "stress" pour voir si je perdre des données en vertu de la charge élevée de l'uc, mais ce n'est pas le cas.

Cordialement

c++ modbus multithreading qml
2021-10-27 11:45:23
1

La meilleure réponse

1

J'ai trouvé le problème:

Comme je le pensais le qml moteur de rendu, graphe de scène ou ce que vous appelez, causée images manquées de l'modbus réception. Je suppose que d'une certaine manière le filetage aurait aidé, mais je n'ai pas pu corriger par la modbusInterface exécuter dans un thread séparé.

En fin de compte la solution était de permettre à la tige filetée boucle de rendu de la scène graphique comme indiqué ici: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

I. e. en mettant

qputenv("QSG_RENDER_LOOP","threaded");

dans mon main().

2021-10-28 12:49:29

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................