我正在开发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,我们可以看到以下注释:



正如您提到的“同时有许多请求”一样,这可以解释您的问题。

实际上,我相信您注意到的排队与readyRead()调用无关,而是与QModbusClient端有关。

对回调调用使用多线程将无济于事,因为您不能“将车放在马前” :)

10-08 08:46