diff options
author | Lubomir I. Ivanov <neolit123@gmail.com> | 2020-01-27 05:35:35 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2020-01-27 09:51:31 -0800 |
commit | e69f5c4e28759d13541c1f35c321d25e2a10c5c3 (patch) | |
tree | 3cdfb0a2f88a4aef71089132782c954d32f7a472 | |
parent | aceb8a547f1ea70b71ab609c6e406928dee74b88 (diff) | |
download | subsurface-e69f5c4e28759d13541c1f35c321d25e2a10c5c3.tar.gz |
core/qtserialbluetooth.cpp: use QEventLoop for polling
The Qt docs here:
https://doc.qt.io/qt-5/qbluetoothsocket.html#details
and here:
https://doc.qt.io/qt-5/qabstractsocket.html#waitForReadyRead
say that waitForReadyRead() does not work for QBluetoothSocket
and that it's flaky on Windows for the underlying QAbstractSocket.
Use a QEventLoop and a QTimer to poll the readyRead() signal.
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
-rw-r--r-- | core/qtserialbluetooth.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/core/qtserialbluetooth.cpp b/core/qtserialbluetooth.cpp index 9d79d863b..6b47524de 100644 --- a/core/qtserialbluetooth.cpp +++ b/core/qtserialbluetooth.cpp @@ -212,7 +212,16 @@ static dc_status_t qt_serial_poll(void *io, int timeout) if (!device->socket) return DC_STATUS_INVALIDARGS; - if (device->socket->waitForReadyRead(timeout)) + + QEventLoop loop; + QTimer timer; + timer.setSingleShot(true); + loop.connect(&timer, SIGNAL(timeout()), SLOT(quit())); + loop.connect(device->socket, SIGNAL(readyRead()), SLOT(quit())); + timer.start(timeout); + loop.exec(); + + if (!timer.isActive()) return DC_STATUS_SUCCESS; return DC_STATUS_TIMEOUT; } |