我正在开发Modbus应用程序。发送这样的读取请求。
void MainWindow::readData(int start,int len){
QModbusDataUnit readUnit(QModbusDataUnit::InputRegisters,start,len);
if (auto *reply = modbusDevice->sendReadRequest(readUnit,modbusAddr)) {
if (!reply->isFinished())
connect(reply, &QModbusReply::finished, this, &MainWindow::readReady);
else
delete reply; // broadcast replies return immediately
}
}
由于我同时有许多读取请求,因此我认为响应被“塞住”在某种队列中,它们逐一执行每个readReady
,这有点慢。
我想在自己的线程中执行每个readReady
。我有办法吗?或者,也许这将是“不良做法”?
我已经尝试过在readReady
插槽中使用QtConcurrent :: run,但这并没有真正的帮助。
我不认为问题来自readReady()
。
QModbusClient::sendReadRequest()
完成后,立即调用readReady()
回调。您的完成速度不能超过完成请求所花费的时间。
[如果我们看一下QModbusClient
documentation,我们可以看到此注释:
注意:QModbusClient将收到的请求排队。并行执行的请求数取决于协议。例如,台式机平台上的HTTP协议针对一个主机/端口组合并行发出6个请求。
正如您所提到的,您有“同时有多个请求”,这可能可以解释您的问题。
实际上,我相信您注意到的排队与QModbusClient
通话无关,而与readyRead()
通话有关。
由于回调不能使用多线程,所以您将无法使用,因为您不能“先把马放进马”:)
无关:在QModbusClient
实现中,您应该:
readData()
不等于QModbusReply*
(如果出错则由nullptr
返回),检查没有错误发生。QModbusClient::sendReadRequest()
时请确保deleteLater()
。