Dispatch pending events without waiting for idle time (closes #10994).

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61470 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-07-20 12:14:42 +00:00
parent a6982a3882
commit 26bacb82ff
4 changed files with 30 additions and 9 deletions

View File

@@ -94,18 +94,33 @@ wxEventLoopManual::wxEventLoopManual()
m_shouldExit = false;
}
bool wxEventLoopManual::ProcessEvents()
{
// process pending wx events first as they correspond to low-level events
// which happened before, i.e. typically pending events were queued by a
// previous call to Dispatch() and if we didn't process them now the next
// call to it might enqueue them again (as happens with e.g. socket events
// which would be generated as long as there is input available on socket
// and this input is only removed from it when pending event handlers are
// executed)
if ( wxTheApp )
wxTheApp->ProcessPendingEvents();
return Dispatch();
}
int wxEventLoopManual::Run()
{
// event loops are not recursive, you need to create another loop!
wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message loop") );
// ProcessIdle() and Dispatch() below may throw so the code here should
// ProcessIdle() and ProcessEvents() below may throw so the code here should
// be exception-safe, hence we must use local objects for all actions we
// should undo
wxEventLoopActivator activate(this);
// we must ensure that OnExit() is called even if an exception is thrown
// from inside Dispatch() but we must call it from Exit() in normal
// from inside ProcessEvents() but we must call it from Exit() in normal
// situations because it is supposed to be called synchronously,
// wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or
// something similar here)
@@ -133,14 +148,15 @@ int wxEventLoopManual::Run()
if ( m_shouldExit )
{
while ( Pending() )
Dispatch();
ProcessEvents();
break;
}
// a message came or no more idle processing to do, sit in
// Dispatch() waiting for the next message
if ( !Dispatch() )
// a message came or no more idle processing to do, dispatch
// all the pending events and call Dispatch() to wait for the
// next message
if ( !ProcessEvents() )
{
// we got WM_QUIT
break;