Merge pull request #656 from galkinvv/fix-win10-cpu-usage-spikes
Fixes high cpu usage spikes on win10
This commit is contained in:
commit
0f29c7716d
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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*
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue