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

自己建网站好还是用淘宝做好浙江方远建设集团网站

自己建网站好还是用淘宝做好,浙江方远建设集团网站,东莞常平天气,团智慧团建登录入口最近使用QModbusTCPClient 与一套设备通信#xff0c;有一个QTimer频繁的通过读取设备寄存器。程序运行良好#xff0c;但是有个问题#xff1a;正常进行中设备断电了#xff0c;整个程序都会崩溃。解决过程如下#xff1a; 1.失败方案一 在QModbusTCPClient的errorOccu…最近使用QModbusTCPClient 与一套设备通信有一个QTimer频繁的通过读取设备寄存器。程序运行良好但是有个问题正常进行中设备断电了整个程序都会崩溃。解决过程如下 1.失败方案一 在QModbusTCPClient的errorOccurred信号中判断错误后及时关闭QTimer,避免出错之后还要频繁访问。 此方案失败问题不在这里。 2.失败方案二 m_reply m_modbus-sendReadRequest(m_unit[1], m_outputID);if(m_reply !m_reply-isFinished()){connect(m_reply, QModbusReply::finished, [this]() {if(m_reply-error() QModbusDevice::NoError){m_outputs m_reply-result().values();}m_modbus-disconnect(SIGNAL(timeoutChanged(int)), 0, 0);delete m_reply;m_reply nullptr;});} 一个典型的应用如上。对 QModbusTCPClient发送读写请求后会得到一个QModbusReply指针根据QModbusReply的finished信号判断请求结果。这个过程是异步的所以上面的及时停止QTimer并不能真的“及时”停止。 在finished的响应槽函数中判断一下error状态再进行后面的操作仍然失败。 3.方案三有点眉目 m_reply m_modbus-sendReadRequest(m_unit[1], m_outputID);if(m_reply !m_reply-isFinished()){connect(m_reply, QModbusReply::finished, [this]() {});} 直接把这个函数体变成空的什么也不做发现程序不崩溃了。问题范围成功缩小。于是对函数体中的逐行打印看看到底哪一步崩溃的。 m_reply m_modbus-sendReadRequest(m_unit[1], m_outputID);if(m_reply !m_reply-isFinished()){connect(m_reply, QModbusReply::finished, [this]() { qDebug()1;if(m_reply-error() QModbusDevice::NoError){ qDebug()2;m_outputs m_reply-result().values();} qDebug()3;m_modbus-disconnect(SIGNAL(timeoutChanged(int)), 0, 0); qDebug()4;delete m_reply; qDebug()5;m_reply nullptr;});} 结果发现只要对m_reply进行访问就会崩溃。  4.方案四部分解决 在reply的finished信号响应函数中为啥不能访问reply呢打印一下reply看看啥情况。 m_reply m_modbus-sendReadRequest(m_unit[1], m_outputID);if(m_reply !m_reply-isFinished()){connect(m_reply, QModbusReply::finished, [this]() {qDebug()m_reply;});} 一旦QModbus设备断电reply竟然是空值 QModbusReply(0x232d1d5de40) QModbusReply(0x232d1d5f3b0) QModbusReply(0x232d1d604e0) QModbusReply(0x232d1d60f00) QModbusReply(0x232d1d630e0) TCP socket error (The remote host closed the connection). QModbusDevice::UnconnectedState QObject(0x0) QObject(0x0) QObject(0x0) QObject(0x0) QObject(0x0) 远程服务器关闭之后reply的响应函数中访问reply竟然是空值 所以在响应函数中还要判断reply是都为空值才能继续 m_reply m_modbus-sendReadRequest(m_unit[1], m_outputID);if(m_reply !m_reply-isFinished()){connect(m_reply, QModbusReply::finished, [this]() {if (!m_reply[0]) {return ;}if(m_reply-error() QModbusDevice::NoError){m_outputs m_reply-result().values();}m_modbus-disconnect(SIGNAL(timeoutChanged(int)), 0, 0);delete m_reply;m_reply nullptr;});} 这样处理后程序终于正常了但是又出现了另一个问题。 5.方案五完整解决 上述方案中使用deleter m_reply竟然也有问题。当本来通信超时的时候比如传入的错误的通信地址响应会比较慢。此时服务器断开连接reply竟然不是nullptr此时程序在delete reply这句崩了。怀疑此时的reply还在异步处理别的事情。改成reply-deleterLater()之后就没问题了。 还有一个隐藏的问题m_modbus-disconnect(SIGNAL(timeoutChanged(int)), 0, 0) 这句是为了解决内存增加问题如果服务器中断导致replynullptr,这句话就被跳过了。可以把这句放在函数体最前面并没有导致问题。 完整解决后如下 m_reply m_modbus-sendReadRequest(read, m_485ID);if(m_reply !m_reply-isFinished()){connect(m_reply, QModbusReply::finished, [this]() {m_modbus-disconnect(SIGNAL(timeoutChanged(int)), 0, 0);//如果远程服务器关闭这个reply是0if (!m_reply) {return ;}if(m_reply-error() QModbusDevice::NoError){QVectorquint16values m_reply-result().values();if(m_values ! values) {m_values values;}}//如果超时错误下面不能直接delete否则服务中断仍然崩溃m_reply-deleteLater();m_reply nullptr;});}else {m_modbus-disconnect(SIGNAL(timeoutChanged(int)), 0, 0);m_reply-deleteLater();m_reply nullptr;} 目前算是彻底解决崩溃问题后面继续测试。
http://www.ho-use.cn/article/10823190.html

相关文章:

  • 杭州网站制作蒙特php网站开发技术前景
  • 一个人只做网站的流程网站域名需icp备案
  • 网站设计的优化青岛网站设计多少钱
  • 网站侧边菜单网站优化北京如何联系?
  • 网站后缀cowordpress安全问题
  • 楚雄做网站四年级的简短新闻播报
  • 同心食品厂网站建设项目任务分解内蒙古网站制作
  • 鲜花电商网站开发班级网站建设模板
  • 资源优化网站排名用什么软件可以做网站动态
  • 灯饰外贸网站360可以做网站
  • 怎么做网站引流做网站领券收佣金
  • 网站建设运营公司推荐深圳一建公司
  • 西安网站建设的费用网站制作评价指标
  • 官网网站开发asp.net网站开发第一步
  • 西宁知名网站设计公司华为荣耀手机最新款
  • 北京建设职工大学网站wordpress自定义页面宽度
  • 网站整体建设方案设计百度网站认证
  • 宣城网站seo诊断宁波网站建设官网
  • 平面设计跟网站建设产品推广方案范例
  • 网站可以更更换空间吗网页美工培训班
  • 圣诞网站源码上海有什么seo公司
  • 贸易公司如何做英文网站零售户订烟电商网站
  • 长沙网站制作哪里好免费咨询合同范本
  • 建个人网站赚钱多吗长沙新媒体运营公司
  • 如何衡量一个网站的价值网站策划书是什么
  • 宜宾网站建设费用制作简单的网页代码
  • 看电视剧免费的网站关于网站设计的价格
  • 网站开发按工时收费wordpress网站搬迁
  • 腾讯视频网站建设维护wordpress婚庆主题公园
  • 青岛网站制作方案j2ee 网站开发