Qt QML-QModBus อ่านเกิดความเสียหายโดย QML BusyIndicator/การเคลื่อนไหว-SingleThread

0

คำถาม

ฉันมีนัดเดียวด้าย QQuick องโปรแกรมกับหน้าต่างหลักและหนึ่งในชั้นเรียนและจัด Modbus เขียน/อ่านฟังก์ชัน. ทุกอย่างกำลังทำงานสบายดีตอนนี้แต่เมื่อฉันใส่ BusyIndicator ในของฉัน qml หน้าต่างเพื่อแสดงให้เห็นว่ารถบัสกำลังยุ่งฉันได้ค่า crccompression method mismatches และการตอบสนอ timeouts,e.g.:

  • "Discarding การตอบสนองกับผิดค่า crccompression method ได้รับ:64580,คำนวณค่า crccompression method:55067"
  • "อ่านการตอบสนอผิดพลาด:การตอบสนหมดเวลา. (รหัส:0x5)"-qt.modbus:(RTU ลูกค้าของ)ไม่สามารถตรงกับการตอบสนอนกับเปิดการร้องขอ,ไม่สนใจ

ที่ ReadRequest คือส่งผ่านทาง

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

ถ้าไม่มีการกระตุ้นการทำงานกำลังอยู่ในหน้าต่างข้อมูลคืนได้รับโดยไม่มีข้อผิดพลาด.

  • นี่มันสามารถแก้ไขโดยใช้แยกกันเธรดที่ modbus รอ่าน/เขียนวิธีการของแล้วทำไมฉันจะต้องด้วยอะไรซักอย่างนั้น? หรือฉันแค่เพิ่ม misreads นด้วยการต่อเนื่องฟังก์ชันแยกเป็นเธรด?

อย่างที่ฉันเข้าใจว่ามันถึงตอนนี้เนื่องจากความจริงที่ว่าของโปรแกรมตอนนี้วิ่งด้วยการโดดครั้งเดียวด้ายปแบบโทนต่อเนื่องปรับปรุงของส่วนติดต่อผู้ใช้แบบคือบางอย่างวุ่นวายกับแผนกต้อนรับขอต่อเนื่องข้อมูล

ฉันใช้ระบบลินุกซ์บรรทัดคำสั่งเครื่องมือ"ความเครียด"เพื่อดูว่าฉันต้องสูญเสียข้อมูลภายใต้สูงหน่วยประมวลผลเรียกเช่นกันแต่นั่นไม่ใช่คดีนี้

แบบฝากฝัง

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

คำตอบที่ดีที่สุด

1

ฉันเจอปัญหาขอ:

อย่างที่ฉันคิดว่า qml ดแสดงเครื่องยนต์ที่เกิดเหตุกราฟหรืออะไรก็ตามที่คุณเรียกมันทำให้เกิดคิดถึงเฟรมของ modbus งานต้อนรับ ฉันคิดว่าบางทีการอ่านจดหมายอาจจะต้องช่วยกับเรื่องนั้นแต่ฉันไม่สามารถซ่อมมันโดยที่ modbusInterface วิ่งแยกเป็นเส้นด้าย

ในที่สุดทางออกนอกเพื่อเปิดใช้ threaded จัดการพาวงของฉากราฟเป็นกล่าวได้ที่นี่: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

ฉันส่งอีเมล์. โดยการให้

qputenv("QSG_RENDER_LOOP","threaded");

ในของฉันหลัก().

2021-10-28 12:49:29

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่