summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/winrt
diff options
context:
space:
mode:
authorAndrew Knight <andrew.knight@digia.com>2014-01-06 22:51:49 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-07 10:55:28 +0100
commit153f82390dd977436000de5aae2fe8eb4a5d9936 (patch)
treec173028ef970d94dd638215c4a9a24c13132592a /src/plugins/platforms/winrt
parentae56140b50bccde9e6cfdc6757f345c989ccd755 (diff)
WinRT: Improve event dispatcher
- Sleep when there are no events to process. Otherwise, CPU usage remains high all the time. - Reorder processing so window events are processed after being collected by the native event loop. - Provide basic interrupt and WaitForMoreEvents flag support. Task-number: QTBUG-35327 Change-Id: I8a5545cba5f3e65eafd0bb40695bf6ffde68bb04 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
Diffstat (limited to 'src/plugins/platforms/winrt')
-rw-r--r--src/plugins/platforms/winrt/qwinrteventdispatcher.cpp34
-rw-r--r--src/plugins/platforms/winrt/qwinrteventdispatcher.h9
2 files changed, 35 insertions, 8 deletions
diff --git a/src/plugins/platforms/winrt/qwinrteventdispatcher.cpp b/src/plugins/platforms/winrt/qwinrteventdispatcher.cpp
index 3fada75b25..baa8b5c636 100644
--- a/src/plugins/platforms/winrt/qwinrteventdispatcher.cpp
+++ b/src/plugins/platforms/winrt/qwinrteventdispatcher.cpp
@@ -52,12 +52,14 @@
using namespace ABI::Windows::ApplicationModel::Core;
using namespace ABI::Windows::UI::Core;
using namespace ABI::Windows::Foundation;
+using namespace Microsoft::WRL;
QT_BEGIN_NAMESPACE
QWinRTEventDispatcher::QWinRTEventDispatcher(ICoreDispatcher *dispatcher, QObject *parent)
: QEventDispatcherWinRT(parent)
, m_dispatcher(dispatcher)
+ , m_interrupt(false)
{
}
@@ -66,14 +68,38 @@ bool QWinRTEventDispatcher::hasPendingEvents()
return QEventDispatcherWinRT::hasPendingEvents() || QWindowSystemInterface::windowSystemEventsQueued();
}
+void QWinRTEventDispatcher::interrupt()
+{
+ m_interrupt = true;
+}
+
bool QWinRTEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
{
- if (m_dispatcher)
- m_dispatcher->ProcessEvents(CoreProcessEventsOption_ProcessAllIfPresent);
+ bool canWait = flags & QEventLoop::WaitForMoreEvents;
+ bool didProcess;
+ m_interrupt = false;
+ do {
+ // Send Qt events
+ didProcess = QEventDispatcherWinRT::processEvents(flags);
+
+ // Process system events
+ emit aboutToBlock();
+ if (m_dispatcher)
+ m_dispatcher->ProcessEvents(CoreProcessEventsOption_ProcessAllIfPresent);
+ emit awake();
- const bool didProcess = QWindowSystemInterface::sendWindowSystemEvents(flags);
+ // Dispatch accumulated user events
+ didProcess |= QWindowSystemInterface::sendWindowSystemEvents(flags);
+ canWait = canWait && !didProcess && !m_interrupt;
- return QEventDispatcherWinRT::processEvents(flags & ~QEventLoop::WaitForMoreEvents) || didProcess;
+ // Short sleep if there is nothing to do
+ if (canWait) {
+ emit aboutToBlock();
+ WaitForSingleObjectEx(GetCurrentThread(), 1, true);
+ emit awake();
+ }
+ } while (canWait);
+ return didProcess;
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/winrt/qwinrteventdispatcher.h b/src/plugins/platforms/winrt/qwinrteventdispatcher.h
index 275a508b3c..741007c7fa 100644
--- a/src/plugins/platforms/winrt/qwinrteventdispatcher.h
+++ b/src/plugins/platforms/winrt/qwinrteventdispatcher.h
@@ -42,11 +42,10 @@
#ifndef QWINRTEVENTDISPATCHER_H
#define QWINRTEVENTDISPATCHER_H
-#include <QtCore/QAbstractEventDispatcher>
-#include <QtCore/QEvent>
-
#include <QtCore/private/qeventdispatcher_winrt_p.h>
+#include <wrl.h>
+
namespace ABI {
namespace Windows {
namespace UI {
@@ -66,11 +65,13 @@ public:
explicit QWinRTEventDispatcher(ABI::Windows::UI::Core::ICoreDispatcher *dispatcher, QObject *parent = 0);
protected:
+ void interrupt();
bool hasPendingEvents();
bool processEvents(QEventLoop::ProcessEventsFlags flags);
private:
- ABI::Windows::UI::Core::ICoreDispatcher *m_dispatcher;
+ Microsoft::WRL::ComPtr<ABI::Windows::UI::Core::ICoreDispatcher> m_dispatcher;
+ bool m_interrupt;
friend class QWinRTIntegration;
};