在不同的线程中执行每个 QTModbus 响应
Execute each QTModbus response in different thread
我正在开发 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
}
}
由于我同时有很多读取请求,我相信响应是 'stuck' 在某种队列中逐个执行每个 readReady
,这有点慢。
我想在各自的线程中执行每个 readReady
。
我有什么办法可以做到吗?
或者,这可能是 'a bad practice'?
我试过在 readReady
插槽中使用 QtConcurrent::run,但这并没有多大帮助。
我不认为问题来自 readReady()
。
一旦 QModbusClient::sendReadRequest()
完成,您就会调用 readReady()
回调。您的速度不能超过完成请求所需的时间。
如果我们看一下 QModbusClient
documentation,我们可以看到这条注释:
Note: QModbusClient queues the requests it receives. The number of requests executed in parallel is dependent on the protocol. For example, the HTTP protocol on desktop platforms issues 6 requests in parallel for one host/port combination.
正如您提到的 "many requests at the same time",这可以解释您的问题。
实际上我相信您注意到的排队与 readyRead()
调用无关,而是与 QModbusClient
端有关。
对回调调用使用多线程无济于事,因为您不能 "put the cart before the horse" :)
使用 Modbus RTU,通过串行连接发送请求,您首先必须等待接收前一个请求的响应。
您不能一次发送多个请求,串行连接无法控制由此产生的冲突。
只要从设备能够处理请求队列,就可以使用 Modbus/TCP,但并非所有设备都能做到这一点。
我正在开发 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
}
}
由于我同时有很多读取请求,我相信响应是 'stuck' 在某种队列中逐个执行每个 readReady
,这有点慢。
我想在各自的线程中执行每个 readReady
。
我有什么办法可以做到吗?
或者,这可能是 'a bad practice'?
我试过在 readReady
插槽中使用 QtConcurrent::run,但这并没有多大帮助。
我不认为问题来自 readReady()
。
一旦 QModbusClient::sendReadRequest()
完成,您就会调用 readReady()
回调。您的速度不能超过完成请求所需的时间。
如果我们看一下 QModbusClient
documentation,我们可以看到这条注释:
Note: QModbusClient queues the requests it receives. The number of requests executed in parallel is dependent on the protocol. For example, the HTTP protocol on desktop platforms issues 6 requests in parallel for one host/port combination.
正如您提到的 "many requests at the same time",这可以解释您的问题。
实际上我相信您注意到的排队与 readyRead()
调用无关,而是与 QModbusClient
端有关。
对回调调用使用多线程无济于事,因为您不能 "put the cart before the horse" :)
使用 Modbus RTU,通过串行连接发送请求,您首先必须等待接收前一个请求的响应。
您不能一次发送多个请求,串行连接无法控制由此产生的冲突。
只要从设备能够处理请求队列,就可以使用 Modbus/TCP,但并非所有设备都能做到这一点。