1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

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

This commit is contained in:
ed 2020-01-13 14:52:39 +00:00
parent eedb9e9833
commit cda97c6593

View file

@ -80,35 +80,36 @@ public:
}
}
bool postMessage (MessageManager::MessageBase* message)
void postMessage (MessageManager::MessageBase* message)
{
message->incReferenceCount();
bool shouldTriggerMessageQueueDispatch = false;
{
const ScopedLock sl (lock);
shouldTriggerMessageQueueDispatch = messageQueue.isEmpty();
messageQueue.add (message);
}
if (! shouldTriggerMessageQueueDispatch)
return;
#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client && JucePlugin_Build_Unity
if (juce_isRunningInUnity())
return SendNotifyMessage (juce_messageWindowHandle, customMessageID, 0, (LPARAM) message) != 0;
{
SendNotifyMessage (juce_messageWindowHandle, customMessageID, 0, 0);
return;
}
#endif
if (PostMessage (juce_messageWindowHandle, customMessageID, 0, (LPARAM) message) != 0)
return true;
if (GetLastError() == ERROR_NOT_ENOUGH_QUOTA)
{
const ScopedLock sl (lock);
overflowQueue.add (message);
message->decReferenceCount();
return true;
}
return false;
PostMessage (juce_messageWindowHandle, customMessageID, 0, 0);
}
bool dispatchNextMessage (bool returnIfNoPendingMessages)
{
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;
if (GetMessage (&m, (HWND) 0, 0, 0) >= 0)
@ -120,7 +121,7 @@ public:
if (m.message == customMessageID && m.hwnd == juce_messageWindowHandle)
{
dispatchMessageFromLParam (m.lParam);
dispatchMessages();
}
else if (m.message == WM_QUIT)
{
@ -145,8 +146,6 @@ public:
}
}
dispatchOverflowMessages();
return true;
}
@ -158,12 +157,8 @@ private:
{
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())
queue->dispatchOverflowMessages();
queue->dispatchMessages();
return 0;
}
@ -196,9 +191,7 @@ private:
return TRUE;
}
static void dispatchMessageFromLParam (LPARAM lParam)
{
if (auto message = reinterpret_cast<MessageManager::MessageBase*> (lParam))
static void dispatchMessage (MessageManager::MessageBase* message)
{
JUCE_TRY
{
@ -208,7 +201,6 @@ private:
message->decReferenceCount();
}
}
static void handleBroadcastMessage (const COPYDATASTRUCT* data)
{
@ -228,24 +220,24 @@ private:
}
}
void dispatchOverflowMessages()
void dispatchMessages()
{
ReferenceCountedArray<MessageManager::MessageBase> messagesToDispatch;
{
const ScopedLock sl (lock);
if (overflowQueue.isEmpty())
if (messageQueue.isEmpty())
return;
messagesToDispatch.swapWith (overflowQueue);
messagesToDispatch.swapWith (messageQueue);
}
for (int i = 0; i < messagesToDispatch.size(); ++i)
{
auto message = messagesToDispatch.getUnchecked (i);
message->incReferenceCount();
dispatchMessageFromLParam ((LPARAM) message.get());
dispatchMessage (message.get());
}
}
@ -257,7 +249,7 @@ private:
std::unique_ptr<HiddenMessageWindow> messageWindow;
CriticalSection lock;
ReferenceCountedArray<MessageManager::MessageBase> overflowQueue;
ReferenceCountedArray<MessageManager::MessageBase> messageQueue;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalMessageQueue)