From cdbd68fc2fab60fdf6834615db586715b01f4380 Mon Sep 17 00:00:00 2001 From: Alex Trotsenko Date: Thu, 22 Mar 2018 17:34:16 +0200 Subject: Allow QWinEventNotifier to coexist with waiting functions Many subclasses of QIODevice have a functionality to block execution until some asynchronous I/O operation completes. In case we are using QWinEventNotifier, a typical reimplemented waitFor{ReadyRead |BytesWritten}() function could look like: if (WaitForSingleObject(notifier.handle(),...) == WAIT_OBJECT_0) { notifier.setEnabled(false); ResetEvent(notifier.handle()); bool res = GetOverlappedResult(...); ... return true; } Despite the fact that the operation ends synchronously, it leaves the notifier in a state that indicates it has received the event, so its next call to setEnabled(true) will produce a fake notification. So, we should reset a notifier's history before enabling it again. Change-Id: I62a9dd809ce6a7a40e9d8038f2a49299b36f8142 Reviewed-by: Edward Welbourne Reviewed-by: Joerg Bornemann --- .../qwineventnotifier/tst_qwineventnotifier.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'tests/auto') diff --git a/tests/auto/corelib/kernel/qwineventnotifier/tst_qwineventnotifier.cpp b/tests/auto/corelib/kernel/qwineventnotifier/tst_qwineventnotifier.cpp index 76efa008f7..74beab96a6 100644 --- a/tests/auto/corelib/kernel/qwineventnotifier/tst_qwineventnotifier.cpp +++ b/tests/auto/corelib/kernel/qwineventnotifier/tst_qwineventnotifier.cpp @@ -46,6 +46,7 @@ protected slots: private slots: void simple_data(); void simple(); + void blockedWaiting(); void manyNotifiers(); void disableNotifiersInActivatedSlot_data(); void disableNotifiersInActivatedSlot(); @@ -104,6 +105,26 @@ void tst_QWinEventNotifier::simple() QVERIFY(simpleActivated); } +void tst_QWinEventNotifier::blockedWaiting() +{ + simpleHEvent = CreateEvent(0, true, false, 0); + QWinEventNotifier n(simpleHEvent); + QObject::connect(&n, &QWinEventNotifier::activated, + this, &tst_QWinEventNotifier::simple_activated); + simpleActivated = false; + + SetEvent(simpleHEvent); + QCOMPARE(WaitForSingleObject(simpleHEvent, 1000), WAIT_OBJECT_0); + + n.setEnabled(false); + ResetEvent(simpleHEvent); + n.setEnabled(true); + + QTestEventLoop::instance().enterLoop(1); + QVERIFY(QTestEventLoop::instance().timeout()); + QVERIFY(!simpleActivated); +} + class EventWithNotifier : public QObject { Q_OBJECT -- cgit v1.2.3