Browse Source

Windows: Refactored the internal message queue to avoid hitting the message limit

tags/2021-05-28
ed 5 years ago
parent
commit
cda97c6593
1 changed files with 30 additions and 38 deletions
  1. +30
    -38
      modules/juce_events/native/juce_win32_Messaging.cpp

+ 30
- 38
modules/juce_events/native/juce_win32_Messaging.cpp View File

@@ -80,35 +80,36 @@ public:
} }
} }
bool postMessage (MessageManager::MessageBase* message)
void postMessage (MessageManager::MessageBase* message)
{ {
message->incReferenceCount();
bool shouldTriggerMessageQueueDispatch = false;
#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity
if (juce_isRunningInUnity())
return SendNotifyMessage (juce_messageWindowHandle, customMessageID, 0, (LPARAM) message) != 0;
#endif
if (PostMessage (juce_messageWindowHandle, customMessageID, 0, (LPARAM) message) != 0)
return true;
if (GetLastError() == ERROR_NOT_ENOUGH_QUOTA)
{ {
const ScopedLock sl (lock); const ScopedLock sl (lock);
overflowQueue.add (message);
message->decReferenceCount();
return true;
shouldTriggerMessageQueueDispatch = messageQueue.isEmpty();
messageQueue.add (message);
}
if (! shouldTriggerMessageQueueDispatch)
return;
#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity
if (juce_isRunningInUnity())
{
SendNotifyMessage (juce_messageWindowHandle, customMessageID, 0, 0);
return;
} }
#endif
return false;
PostMessage (juce_messageWindowHandle, customMessageID, 0, 0);
} }
bool dispatchNextMessage (bool returnIfNoPendingMessages) bool dispatchNextMessage (bool returnIfNoPendingMessages)
{ {
MSG m; MSG m;
if (returnIfNoPendingMessages && ! PeekMessage (&m, (HWND) 0, 0, 0, PM_NOREMOVE) && overflowQueue.size() == 0)
if (returnIfNoPendingMessages && ! PeekMessage (&m, (HWND) 0, 0, 0, PM_NOREMOVE))
return false; return false;
if (GetMessage (&m, (HWND) 0, 0, 0) >= 0) if (GetMessage (&m, (HWND) 0, 0, 0) >= 0)
@@ -120,7 +121,7 @@ public:
if (m.message == customMessageID && m.hwnd == juce_messageWindowHandle) if (m.message == customMessageID && m.hwnd == juce_messageWindowHandle)
{ {
dispatchMessageFromLParam (m.lParam);
dispatchMessages();
} }
else if (m.message == WM_QUIT) else if (m.message == WM_QUIT)
{ {
@@ -145,8 +146,6 @@ public:
} }
} }
dispatchOverflowMessages();
return true; return true;
} }
@@ -158,12 +157,8 @@ private:
{ {
if (message == customMessageID) if (message == customMessageID)
{ {
// (These are trapped early in our dispatch loop, but must also be checked
// here in case some 3rd-party code is running the dispatch loop).
dispatchMessageFromLParam (lParam);
if (auto* queue = InternalMessageQueue::getInstanceWithoutCreating()) if (auto* queue = InternalMessageQueue::getInstanceWithoutCreating())
queue->dispatchOverflowMessages();
queue->dispatchMessages();
return 0; return 0;
} }
@@ -196,18 +191,15 @@ private:
return TRUE; return TRUE;
} }
static void dispatchMessageFromLParam (LPARAM lParam)
static void dispatchMessage (MessageManager::MessageBase* message)
{ {
if (auto message = reinterpret_cast<MessageManager::MessageBase*> (lParam))
JUCE_TRY
{ {
JUCE_TRY
{
message->messageCallback();
}
JUCE_CATCH_EXCEPTION
message->decReferenceCount();
message->messageCallback();
} }
JUCE_CATCH_EXCEPTION
message->decReferenceCount();
} }
static void handleBroadcastMessage (const COPYDATASTRUCT* data) static void handleBroadcastMessage (const COPYDATASTRUCT* data)
@@ -228,24 +220,24 @@ private:
} }
} }
void dispatchOverflowMessages()
void dispatchMessages()
{ {
ReferenceCountedArray<MessageManager::MessageBase> messagesToDispatch; ReferenceCountedArray<MessageManager::MessageBase> messagesToDispatch;
{ {
const ScopedLock sl (lock); const ScopedLock sl (lock);
if (overflowQueue.isEmpty())
if (messageQueue.isEmpty())
return; return;
messagesToDispatch.swapWith (overflowQueue);
messagesToDispatch.swapWith (messageQueue);
} }
for (int i = 0; i < messagesToDispatch.size(); ++i) for (int i = 0; i < messagesToDispatch.size(); ++i)
{ {
auto message = messagesToDispatch.getUnchecked (i); auto message = messagesToDispatch.getUnchecked (i);
message->incReferenceCount(); message->incReferenceCount();
dispatchMessageFromLParam ((LPARAM) message.get());
dispatchMessage (message.get());
} }
} }
@@ -257,7 +249,7 @@ private:
std::unique_ptr<HiddenMessageWindow> messageWindow; std::unique_ptr<HiddenMessageWindow> messageWindow;
CriticalSection lock; CriticalSection lock;
ReferenceCountedArray<MessageManager::MessageBase> overflowQueue;
ReferenceCountedArray<MessageManager::MessageBase> messageQueue;
//============================================================================== //==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalMessageQueue) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalMessageQueue)


Loading…
Cancel
Save