当前位置: 首页 > news >正文

QModbusTCPClient占用内存持续增长

    最近使用QModbusTCPClient通信,需要频繁发送读写请求,发现软件占用内存一直在增减,经过不断咨询和尝试,终于解决了。

1.方案一(失败)

最开始以为是访问太频繁,导致创建reply的对象比delete reply快导致的。尝试增加时间间隔,发现无效。内存占用还是在增加,只是增速慢了点。

QModbusReply*reply= m_modbus->sendReadRequest();

2.方案二(失败)

直接保存每个reply,只有reply==nullptr时才能重复发送对应的request()请求。在reply的finish槽函数中delete reply,同时让reply=nullptr。这样可以避免过于频繁的通信,确保前一次request()处理响应之后再次发送相同的request().

if(!m_reply[4])         //确保前一次响应处理之后再次发送相同的request(){QVector<quint16>values(1, 0);QModbusDataUnit read(QModbusDataUnit::Coils, 128 + m_param->motorID(), values);m_reply[4] = m_modbus->sendReadRequest(read, m_485ID);if(m_reply[4] && !m_reply[4]->isFinished()){connect(m_reply[4], &QModbusReply::finished, [this]() {if(m_reply[4]->error() == QModbusDevice::NoError){m_runState = m_reply[4]->result().values().first();}delete  m_reply[4];m_reply[4] = nullptr;//确保下次可以再次发送request()});}else {delete  m_reply[4];m_reply[4] = nullptr;}}

仍然没有解决问题,内存还是在持续增加。

3.方案三(成功)

感谢这里的内容

https://bugreports.qt.io/browse/QTBUG-92072

问题:

//qmodbusclient_p.h ->enqueueRequest
q->connect(q, &QModbusClient::timeoutChanged,element.timer.data(), QOverload<int>::of(&QTimer::setInterval));

QModbusTCPClient的每次request(无论读写)都会增加这样一个连接。即使销毁了对应的reply,也不能删除该链接,导致内存逐渐增加。

解决:

针对每一次request,手动断开该链接。

m_modbus->disconnect(SIGNAL(timeoutChanged(int)), 0, 0);

一段完整代码:

QModbusReply *reply = m_modbus->sendWriteRequest(m_param->modbusData(topLeft),m_485ID);int id = m_param->index(topLeft.row(), m_param->IDCol).data().toInt();int value = topLeft.data().toInt();QString text = m_param->index(topLeft.row(), m_param->TextCol).data().toString();if(reply && !reply->isFinished()){connect(reply, &QModbusReply::finished, [ = ]() {if(reply->error() == QModbusDevice::NoError){qInfo() << QString("MotorID:%1 Write(%2->%3(%4)) Succeed!\n").arg(m_param->motorID()).arg(value).arg(id).arg(text);}else{qWarning() << QString("MotorID:%1 Write(%2->%3(%4)) Failed!\n").arg(m_param->motorID()).arg(value).arg(id).arg(text);}//响应函数中手动断开连接m_modbus->disconnect(SIGNAL(timeoutChanged(int)), 0, 0);delete  reply;});}else{qWarning() << QString("MotorID:%1 Write(%2->%3(%4)) No Response!\n").arg(m_param->motorID()).arg(value).arg(id).arg(text);
//响应函数中手动断开连接m_modbus->disconnect(SIGNAL(timeoutChanged(int)), 0, 0);delete reply;}

http://www.lryc.cn/news/523058.html

相关文章:

  • 代码中使用 Iterable<T> 作为方法参数的解释
  • Oracle数据库传统审计怎么用
  • leetcode-买卖股票问题
  • MYSQL学习笔记(三):分组、排序、分页查询
  • 上位机工作感想-2024年工作总结和来年计划
  • 【视觉惯性SLAM:十六、 ORB-SLAM3 中的多地图系统】
  • 【C++笔记】红黑树封装map和set深度剖析
  • 4.若依 BaseController
  • vue项目配置多语言
  • 数据可视化大屏设计与实现
  • PDF文件提取开源工具调研总结
  • 多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)
  • 【机器学习实战入门项目】使用深度学习创建您自己的表情符号
  • 技术洞察:C++在后端开发中的前沿趋势与社会影响
  • 【人工智能 | 大数据】基于人工智能的大数据分析方法
  • 数字经济时代下的创新探索与实践:以“开源AI智能名片2+1链动模式S2B2C商城小程序源码”为核心
  • 【English-Book】Go in Action目录页翻译中文
  • js: 区分后端返回数字是否为null、‘-’ 或正常number类型数字。
  • 网络变压器的分类
  • SUCTF-SU_BBRE-好久不见21
  • Python 实现 NLP 的完整流程
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>N 皇后
  • JEL分类号
  • 设计和优化用于 AR、HUD 和高级显示系统的表面浮雕光栅
  • 【今日分享】人工智能加速发现能源新材料的结构与性能
  • Boost Asio TCP异步服务端和客户端
  • 1.7 ChatGPT:引领AI对话革命的致胜之道
  • WPS数据分析000001
  • 电脑风扇声音大怎么办? 原因及解决方法
  • 高效实现 Markdown 转 PDF 的跨平台指南20250117