diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2012-12-25 16:09:10 +0400 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2012-12-25 13:44:36 +0100 |
commit | 60a508d30c790c7b52f470b15566e171d4c8351c (patch) | |
tree | 79120c91dbffd95ea3c4ed723f1032995ed895a9 /src | |
parent | 87bb584beb730d52fafd9872da5b14b5dd3606e8 (diff) | |
download | qtserialport-60a508d30c790c7b52f470b15566e171d4c8351c.tar.gz |
Windows: Fix infinite Qt-event loop when processing EV_ERR
The cause of the infinite loop was to create a class
CommOverlappedEventNotifier with event handle with
manual-reset type. This handle is not reset to non
signalled state after the event occur.
Solution is to replace the type of handle to auto-reset
with added post-processing using GetOverlappedResult().
Change-Id: I7ef90583686251cb8e6c851482c7a4c3021ca08b
Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/serialport/serialport_win.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/serialport/serialport_win.cpp b/src/serialport/serialport_win.cpp index f4eb321..c04d8fa 100644 --- a/src/serialport/serialport_win.cpp +++ b/src/serialport/serialport_win.cpp @@ -129,7 +129,7 @@ class CommOverlappedEventNotifier : public AbstractOverlappedEventNotifier { public: CommOverlappedEventNotifier(SerialPortPrivate *d, DWORD eventMask, QObject *parent) - : AbstractOverlappedEventNotifier(d, CommEvent, true, parent) + : AbstractOverlappedEventNotifier(d, CommEvent, false, parent) , originalEventMask(eventMask), triggeredEventMask(0) { ::SetCommMask(dptr->descriptor, originalEventMask); startWaitCommEvent(); @@ -138,12 +138,12 @@ public: void startWaitCommEvent() { ::WaitCommEvent(dptr->descriptor, &triggeredEventMask, &o); } virtual bool processCompletionRoutine() { - bool ret = false; + DWORD numberOfBytesTransferred = 0; + ::GetOverlappedResult(dptr->descriptor, &o, &numberOfBytesTransferred, FALSE); if (EV_ERR & triggeredEventMask) - ret = dptr->processIoErrors(); - if (EV_RXCHAR & triggeredEventMask) - ret = dptr->startAsyncRead(); - return ret; + dptr->processIoErrors(); + dptr->startAsyncRead(); + return true; } private: |