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

@@ -197,6 +197,12 @@ protected:
bool m_shouldExit; bool m_shouldExit;
private: private:
// process all already pending events and dispatch a new one (blocking
// until it appears in the event queue if necessary)
//
// returns the return value of Dispatch()
bool ProcessEvents();
wxDECLARE_NO_COPY_CLASS(wxEventLoopManual); wxDECLARE_NO_COPY_CLASS(wxEventLoopManual);
}; };

View File

@@ -333,9 +333,6 @@ void wxAppConsoleBase::WakeUpIdle()
bool wxAppConsoleBase::ProcessIdle() bool wxAppConsoleBase::ProcessIdle()
{ {
// process pending wx events before sending idle events
ProcessPendingEvents();
// synthesize an idle event and check if more of them are needed // synthesize an idle event and check if more of them are needed
wxIdleEvent event; wxIdleEvent event;
event.SetEventObject(this); event.SetEventObject(this);

View File

@@ -94,18 +94,33 @@ wxEventLoopManual::wxEventLoopManual()
m_shouldExit = false; 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() int wxEventLoopManual::Run()
{ {
// event loops are not recursive, you need to create another loop! // event loops are not recursive, you need to create another loop!
wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message 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 // be exception-safe, hence we must use local objects for all actions we
// should undo // should undo
wxEventLoopActivator activate(this); wxEventLoopActivator activate(this);
// we must ensure that OnExit() is called even if an exception is thrown // 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, // situations because it is supposed to be called synchronously,
// wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or // wxModalEventLoop depends on this (so we can't just use ON_BLOCK_EXIT or
// something similar here) // something similar here)
@@ -133,14 +148,15 @@ int wxEventLoopManual::Run()
if ( m_shouldExit ) if ( m_shouldExit )
{ {
while ( Pending() ) while ( Pending() )
Dispatch(); ProcessEvents();
break; break;
} }
// a message came or no more idle processing to do, sit in // a message came or no more idle processing to do, dispatch
// Dispatch() waiting for the next message // all the pending events and call Dispatch() to wait for the
if ( !Dispatch() ) // next message
if ( !ProcessEvents() )
{ {
// we got WM_QUIT // we got WM_QUIT
break; break;

View File

@@ -127,6 +127,8 @@ bool wxApp::DoIdle()
gdk_threads_enter(); gdk_threads_enter();
bool needMore; bool needMore;
do { do {
ProcessPendingEvents();
needMore = ProcessIdle(); needMore = ProcessIdle();
} while (needMore && gtk_events_pending() == 0); } while (needMore && gtk_events_pending() == 0);
gdk_threads_leave(); gdk_threads_leave();