Qt QML-QModBus QML BusyIndicator tarafından bozulmuş okuma/Animasyon-SingleThread

0

Soru

Bir ana pencereye ve Modbus Yazma/Okuma işlevlerini işleyen bir sınıfa sahip tek bir iş parçacıklı QQuick uygulamam var. Şimdiye kadar her şey yolunda gidiyor, ancak qml pencereme Otobüsün meşgul olduğunu göstermek için bir BusyIndicator koyduğumda CRC uyuşmazlıkları ve yanıt zaman aşımları alıyorum, örn.:

  • "Yanlış CRC ile yanıt atma, alındı: 64580, hesaplanan CRC: 55067"
  • "Yanıt hatasını oku: Yanıt zaman aşımı. (kod: 0x5) " - qt.modbus: (RTU istemcisi) Yanıtı açık istekle eşleştiremiyor, yoksayılıyor

ReadRequest üzerinden gönderilir

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();
}

Penceremde çalışan bir animasyon yoksa, veriler hatasız olarak alınır.

  • Bu, modbus okuma / yazma yöntemlerini çalıştırmak için ayrı bir iş parçacığı kullanılarak düzeltilebilir mi ve bunu nasıl uygulayabilirim? Yoksa Seri işlevleri ayrı bir İş Parçacığına koyarak yanlış okumaları mı artıracağım?

Şimdiye kadar anladığım kadarıyla, uygulamamın şu ana kadar tek bir iş parçacığında çalışıyor olması nedeniyle, guı'nin sürekli güncellenmesi bir şekilde Seri Verilerin alınmasına müdahale ediyor.

Yüksek cpu yükü altında da veri kaybedip kaybetmediğimi görmek için linux komut satırı aracını "stres" kullandım, ancak durum böyle değil.

Saygılarımla,

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

En iyi cevabı

1

Sorunu buldum :

Qml oluşturma motorunun, sahne grafiğinin ya da her ne diyorsanız, modbus alımının cevapsız karelerine neden olduğunu düşündüğüm gibi. Sanırım bir şekilde iş parçacığı bu konuda yardımcı olabilirdi, ancak modbusınterface'i ayrı bir iş parçacığında çalıştırarak bunu düzeltemedim.

Sonunda çözüm, burada belirtildiği gibi sahne grafiğinin dişli oluşturma döngüsünü etkinleştirmekti: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

Yani koyarak

qputenv("QSG_RENDER_LOOP","threaded");

benim ana ().

2021-10-28 12:49:29

Diğer dillerde

Bu sayfa diğer dillerde

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