diff --git a/src/comm/BluetoothLink.cc b/src/comm/BluetoothLink.cc index 0babaeeb9291b861416c92ceac72640de13b8987..ede027ed67329a321befbc26642cbeb7917d1519 100644 --- a/src/comm/BluetoothLink.cc +++ b/src/comm/BluetoothLink.cc @@ -86,6 +86,8 @@ void BluetoothLink::disconnect(void) } #endif if(_targetSocket) { + // This prevents stale signals from calling the link after it has been deleted + QObject::connect(_targetSocket, &QBluetoothSocket::readyRead, this, &BluetoothLink::readBytes); _targetSocket->deleteLater(); _targetSocket = nullptr; emit disconnected(); diff --git a/src/comm/SerialLink.cc b/src/comm/SerialLink.cc index 4216a67c4b298b79c100bc7de48a7c3953fa862a..3ed29fd9f3a801940d7dceb59fc9e52d0c7daedc 100644 --- a/src/comm/SerialLink.cc +++ b/src/comm/SerialLink.cc @@ -79,6 +79,8 @@ void SerialLink::_writeBytes(const QByteArray data) void SerialLink::disconnect(void) { if (_port) { + // This prevents stale signals from calling the link after it has been deleted + QObject::disconnect(_port, &QIODevice::readyRead, this, &SerialLink::_readBytes); _port->close(); _port->deleteLater(); _port = nullptr; diff --git a/src/comm/TCPLink.cc b/src/comm/TCPLink.cc index 5e4cc365822933e9b7e1d5a87cf7782523060297..12cd5c0494a3ea7fa000c78c73fbc1a3195e8fd4 100644 --- a/src/comm/TCPLink.cc +++ b/src/comm/TCPLink.cc @@ -106,6 +106,8 @@ void TCPLink::disconnect(void) quit(); wait(); if (_socket) { + // This prevents stale signal from calling the link after it has been deleted + QObject::connect(_socket, &QTcpSocket::readyRead, this, &TCPLink::readBytes); _socketIsConnected = false; _socket->disconnectFromHost(); // Disconnect tcp _socket->waitForDisconnected(); diff --git a/src/comm/UDPLink.cc b/src/comm/UDPLink.cc index cb16f61bd1868e06a66ce45147a07e6e6b6f0854..4c14e916e9f8e421bada040bdb5cee466eb4139e 100644 --- a/src/comm/UDPLink.cc +++ b/src/comm/UDPLink.cc @@ -222,6 +222,8 @@ void UDPLink::disconnect(void) quit(); wait(); if (_socket) { + // This prevents stale signal from calling the link after it has been deleted + QObject::disconnect(_socket, &QUdpSocket::readyRead, this, &UDPLink::readBytes); // Make sure delete happen on correct thread _socket->deleteLater(); _socket = nullptr;