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*
EventQueue::getHandler(Event::Type type, void* target) const
{

View File

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

View File

@ -189,13 +189,6 @@ public:
//! @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
/*!
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 "mt/Thread.h"
#include "base/IEventQueue.h"
#include <VersionHelpers.h>
//
// EventQueueTimer
@ -48,6 +49,15 @@ MSWindowsEventQueueBuffer::MSWindowsEventQueueBuffer(IEventQueue* events) :
// make sure this thread has a message queue
MSG dummy;
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()
@ -79,7 +89,7 @@ MSWindowsEventQueueBuffer::waitForEvent(double timeout)
// cancellation but that's okay because we're run in the main
// thread and we never cancel that thread.
HANDLE dummy[1];
MsgWaitForMultipleObjects(0, dummy, FALSE, t, QS_ALLINPUT);
MsgWaitForMultipleObjects(0, dummy, FALSE, t, m_os_supported_message_types);
}
IEventQueueBuffer::Type
@ -128,9 +138,7 @@ MSWindowsEventQueueBuffer::addEvent(UInt32 dataID)
bool
MSWindowsEventQueueBuffer::isEmpty() const
{
// don't use QS_POINTER, QS_TOUCH, or any meta-flags that include them (like QS_ALLINPUT)
// because they can cause GetQueueStatus() to always return 0 and we miss events
return (HIWORD(GetQueueStatus(QS_POSTMESSAGE)) == 0);
return (HIWORD(GetQueueStatus(m_os_supported_message_types)) == 0);
}
EventQueueTimer*

View File

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