Timeout timer deleting inside fnx reading Modbus reply
-
Hi, i wonna ask if this way of deleting qtimer its 100% safe
QModbusDataUnit readDataUnit(QModbusDataUnit::RegisterType::InputRegisters, addr, count); if (auto *reply = m_modbus->sendReadRequest(readDataUnit, serverAddr)) { if (!reply->isFinished()) { QTimer* replyTimer = new QTimer(); replyTimer->setSingleShot(true); connect(replyTimer, &QTimer::timeout, this, [=]() { m_modbus->disconnect(); replyTimer->stop(); replyTimer->deleteLater(); if(reply) delete reply; emit stateChanged(QModbusDevice::UnconnectedState); }); replyTimer->start(ModbusDevice::replyTimeout); connect(reply, &QModbusReply::errorOccurred, this, &ModbusDevice::errorOccurred); connect(reply, &QModbusReply::finished, this, [=]() { if (replyTimer) { replyTimer->stop(); replyTimer->deleteLater(); } if (!reply) return; if (reply->error() == QModbusDevice::NoError) { const QModbusDataUnit unit = reply->result(); emit dataPooled(QModbusDataUnit::InputRegisters, unit.values(), extraParm); } reply->deleteLater(); }); } else delete reply; } -
Hi, i wonna ask if this way of deleting qtimer its 100% safe
QModbusDataUnit readDataUnit(QModbusDataUnit::RegisterType::InputRegisters, addr, count); if (auto *reply = m_modbus->sendReadRequest(readDataUnit, serverAddr)) { if (!reply->isFinished()) { QTimer* replyTimer = new QTimer(); replyTimer->setSingleShot(true); connect(replyTimer, &QTimer::timeout, this, [=]() { m_modbus->disconnect(); replyTimer->stop(); replyTimer->deleteLater(); if(reply) delete reply; emit stateChanged(QModbusDevice::UnconnectedState); }); replyTimer->start(ModbusDevice::replyTimeout); connect(reply, &QModbusReply::errorOccurred, this, &ModbusDevice::errorOccurred); connect(reply, &QModbusReply::finished, this, [=]() { if (replyTimer) { replyTimer->stop(); replyTimer->deleteLater(); } if (!reply) return; if (reply->error() == QModbusDevice::NoError) { const QModbusDataUnit unit = reply->result(); emit dataPooled(QModbusDataUnit::InputRegisters, unit.values(), extraParm); } reply->deleteLater(); }); } else delete reply; }@qtprogrammer123 You're not deleting the timer in case of an error
-
Hi, i wonna ask if this way of deleting qtimer its 100% safe
QModbusDataUnit readDataUnit(QModbusDataUnit::RegisterType::InputRegisters, addr, count); if (auto *reply = m_modbus->sendReadRequest(readDataUnit, serverAddr)) { if (!reply->isFinished()) { QTimer* replyTimer = new QTimer(); replyTimer->setSingleShot(true); connect(replyTimer, &QTimer::timeout, this, [=]() { m_modbus->disconnect(); replyTimer->stop(); replyTimer->deleteLater(); if(reply) delete reply; emit stateChanged(QModbusDevice::UnconnectedState); }); replyTimer->start(ModbusDevice::replyTimeout); connect(reply, &QModbusReply::errorOccurred, this, &ModbusDevice::errorOccurred); connect(reply, &QModbusReply::finished, this, [=]() { if (replyTimer) { replyTimer->stop(); replyTimer->deleteLater(); } if (!reply) return; if (reply->error() == QModbusDevice::NoError) { const QModbusDataUnit unit = reply->result(); emit dataPooled(QModbusDataUnit::InputRegisters, unit.values(), extraParm); } reply->deleteLater(); }); } else delete reply; }@qtprogrammer123 said in Timeout timer deleting inside fnx reading Modbus reply:
Hi, i wonna ask if this way of deleting qtimer its 100% safe
QModbusDataUnit readDataUnit(QModbusDataUnit::RegisterType::InputRegisters, addr, count); if (auto *reply = m_modbus->sendReadRequest(readDataUnit, serverAddr)) { if (!reply->isFinished()) { QTimer* replyTimer = new QTimer(); replyTimer->setSingleShot(true); connect(replyTimer, &QTimer::timeout, this, [=]() { m_modbus->disconnect(); replyTimer->stop(); replyTimer->deleteLater(); if(reply) delete reply; emit stateChanged(QModbusDevice::UnconnectedState); }); replyTimer->start(ModbusDevice::replyTimeout); connect(reply, &QModbusReply::errorOccurred, this, &ModbusDevice::errorOccurred); connect(reply, &QModbusReply::finished, this, [=]() { if (replyTimer) { replyTimer->stop(); replyTimer->deleteLater(); } if (!reply) return; if (reply->error() == QModbusDevice::NoError) { const QModbusDataUnit unit = reply->result(); emit dataPooled(QModbusDataUnit::InputRegisters, unit.values(), extraParm); } reply->deleteLater(); }); } else delete reply; }destroy queue now look like this:
comming reply -> delete timer -> delete reply -
@qtprogrammer123 You're not deleting the timer in case of an error
@jsulm yes i am, after errorOccured finished signal comes anyway