在不同线程中执行每个QTModbus响应

问题描述 投票:0回答:1

我正在开发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,但这并没有真正的帮助。

c++ multithreading qt modbus
1个回答
0
投票

我不认为问题来自readReady()

QModbusClient::sendReadRequest()完成后,立即调用readReady()回调。您的完成速度不能超过完成请求所花费的时间。

[如果我们看一下QModbusClient documentation,我们可以看到此注释:

注意:QModbusClient将收到的请求排队。并行执行的请求数取决于协议。例如,台式机平台上的HTTP协议针对一个主机/端口组合并行发出6个请求。

正如您所提到的,您有“同时有多个请求”,这可能可以解释您的问题。

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

由于回调不能使用多线程,所以您将无法使用,因为您不能“先把马放进马”:)


无关:QModbusClient实现中,您应该:

  • 通过检查返回的readData()不等于QModbusReply*(如果出错则由nullptr返回),检查没有错误发生。
  • 为了避免内存泄漏(尤其是在有很多请求的情况下,尤其是有很多请求的情况下),在不再需要返回的QModbusClient::sendReadRequest()时请确保deleteLater()
© www.soinside.com 2019 - 2024. All rights reserved.