Merge pull request #656 from galkinvv/fix-win10-cpu-usage-spikes

Fixes high cpu usage spikes on win10
This commit is contained in:
Povilas Kanapickas 2020-06-05 00:30:22 +03:00 committed by GitHub
commit 0f29c7716d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 13 additions and 18 deletions

View File

@ -436,12 +436,6 @@ EventQueue::removeHandlers(void* target)
} }
} }
bool
EventQueue::isEmpty() const
{
return (m_buffer->isEmpty() && getNextTimerTimeout() != 0.0);
}
IEventJob* IEventJob*
EventQueue::getHandler(Event::Type type, void* target) const EventQueue::getHandler(Event::Type type, void* target) const
{ {

View File

@ -58,7 +58,6 @@ public:
virtual void removeHandlers(void* target); virtual void removeHandlers(void* target);
virtual Event::Type virtual Event::Type
registerTypeOnce(Event::Type& type, const char* name); registerTypeOnce(Event::Type& type, const char* name);
virtual bool isEmpty() const;
virtual IEventJob* getHandler(Event::Type type, void* target) const; virtual IEventJob* getHandler(Event::Type type, void* target) const;
virtual const char* getTypeName(Event::Type type); virtual const char* getTypeName(Event::Type type);
virtual Event::Type getRegisteredType(const std::string& name) const; virtual Event::Type getRegisteredType(const std::string& name) const;

View File

@ -189,13 +189,6 @@ public:
//! @name accessors //! @name accessors
//@{ //@{
//! Test if queue is empty
/*!
Returns true iff the queue has no events in it, including timer
events.
*/
virtual bool isEmpty() const = 0;
//! Get an event handler //! Get an event handler
/*! /*!
Finds and returns the event handler for the \p type, \p target pair Finds and returns the event handler for the \p type, \p target pair

View File

@ -21,6 +21,7 @@
#include "arch/win32/ArchMiscWindows.h" #include "arch/win32/ArchMiscWindows.h"
#include "mt/Thread.h" #include "mt/Thread.h"
#include "base/IEventQueue.h" #include "base/IEventQueue.h"
#include <VersionHelpers.h>
// //
// EventQueueTimer // EventQueueTimer
@ -48,6 +49,15 @@ MSWindowsEventQueueBuffer::MSWindowsEventQueueBuffer(IEventQueue* events) :
// make sure this thread has a message queue // make sure this thread has a message queue
MSG dummy; MSG dummy;
PeekMessage(&dummy, NULL, WM_USER, WM_USER, PM_NOREMOVE); PeekMessage(&dummy, NULL, WM_USER, WM_USER, PM_NOREMOVE);
m_os_supported_message_types = QS_ALLINPUT;
if (!IsWindows8OrGreater())
{
// don't use QS_POINTER, QS_TOUCH
// because they can cause GetQueueStatus() to always return 0 and we miss events
// since those flags are confusing Windows 7. See QTBUG-29097 for related info
m_os_supported_message_types &= ~(QS_TOUCH | QS_POINTER);
}
} }
MSWindowsEventQueueBuffer::~MSWindowsEventQueueBuffer() MSWindowsEventQueueBuffer::~MSWindowsEventQueueBuffer()
@ -79,7 +89,7 @@ MSWindowsEventQueueBuffer::waitForEvent(double timeout)
// cancellation but that's okay because we're run in the main // cancellation but that's okay because we're run in the main
// thread and we never cancel that thread. // thread and we never cancel that thread.
HANDLE dummy[1]; HANDLE dummy[1];
MsgWaitForMultipleObjects(0, dummy, FALSE, t, QS_ALLINPUT); MsgWaitForMultipleObjects(0, dummy, FALSE, t, m_os_supported_message_types);
} }
IEventQueueBuffer::Type IEventQueueBuffer::Type
@ -128,9 +138,7 @@ MSWindowsEventQueueBuffer::addEvent(UInt32 dataID)
bool bool
MSWindowsEventQueueBuffer::isEmpty() const MSWindowsEventQueueBuffer::isEmpty() const
{ {
// don't use QS_POINTER, QS_TOUCH, or any meta-flags that include them (like QS_ALLINPUT) return (HIWORD(GetQueueStatus(m_os_supported_message_types)) == 0);
// because they can cause GetQueueStatus() to always return 0 and we miss events
return (HIWORD(GetQueueStatus(QS_POSTMESSAGE)) == 0);
} }
EventQueueTimer* EventQueueTimer*

View File

@ -47,4 +47,5 @@ private:
MSG m_event; MSG m_event;
UINT m_daemonQuit; UINT m_daemonQuit;
IEventQueue* m_events; IEventQueue* m_events;
UINT m_os_supported_message_types;
}; };