Added wxYieldIfNeeded

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9410 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart 2001-02-22 12:09:06 +00:00
parent b7aaabf86f
commit cb2713bfa8
7 changed files with 138 additions and 26 deletions

View File

@ -302,6 +302,9 @@ WXDLLEXPORT wxWindow* wxFindWindowAtPoint(const wxPoint& pt);
// Yield to other apps/messages // Yield to other apps/messages
WXDLLEXPORT bool wxYield(); WXDLLEXPORT bool wxYield();
// Like wxYield, but fails silently if the yield is recursive.
WXDLLEXPORT bool wxYieldIfNeeded();
// Yield to other apps/messages and disable user input // Yield to other apps/messages and disable user input
WXDLLEXPORT bool wxSafeYield(wxWindow *win = NULL); WXDLLEXPORT bool wxSafeYield(wxWindow *win = NULL);

View File

@ -80,6 +80,8 @@ void wxExit()
// wxYield // wxYield
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static bool gs_inYield = FALSE;
bool wxYield() bool wxYield()
{ {
#if wxUSE_THREADS #if wxUSE_THREADS
@ -90,14 +92,12 @@ bool wxYield()
} }
#endif // wxUSE_THREADS #endif // wxUSE_THREADS
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
static bool s_inYield = FALSE; if (gs_inYield)
if (s_inYield)
wxFAIL_MSG( wxT("wxYield called recursively" ) ); wxFAIL_MSG( wxT("wxYield called recursively" ) );
s_inYield = TRUE;
#endif #endif
gs_inYield = TRUE;
if (!g_isIdle) if (!g_isIdle)
{ {
@ -123,13 +123,24 @@ bool wxYield()
// let the logs be flashed again // let the logs be flashed again
wxLog::Resume(); wxLog::Resume();
#ifdef __WXDEBUG__ gs_inYield = FALSE;
s_inYield = FALSE;
#endif
return TRUE; return TRUE;
} }
//-----------------------------------------------------------------------------
// wxYieldIfNeeded
// Like wxYield, but fails silently if the yield is recursive.
//-----------------------------------------------------------------------------
bool wxYieldIfNeeded()
{
if (gs_inYield)
return FALSE;
return wxYield();
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxWakeUpIdle // wxWakeUpIdle
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -80,6 +80,8 @@ void wxExit()
// wxYield // wxYield
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static bool gs_inYield = FALSE;
bool wxYield() bool wxYield()
{ {
#if wxUSE_THREADS #if wxUSE_THREADS
@ -90,14 +92,12 @@ bool wxYield()
} }
#endif // wxUSE_THREADS #endif // wxUSE_THREADS
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
static bool s_inYield = FALSE; if (gs_inYield)
if (s_inYield)
wxFAIL_MSG( wxT("wxYield called recursively" ) ); wxFAIL_MSG( wxT("wxYield called recursively" ) );
s_inYield = TRUE;
#endif #endif
gs_inYield = TRUE;
if (!g_isIdle) if (!g_isIdle)
{ {
@ -123,13 +123,24 @@ bool wxYield()
// let the logs be flashed again // let the logs be flashed again
wxLog::Resume(); wxLog::Resume();
#ifdef __WXDEBUG__ gs_inYield = FALSE;
s_inYield = FALSE;
#endif
return TRUE; return TRUE;
} }
//-----------------------------------------------------------------------------
// wxYieldIfNeeded
// Like wxYield, but fails silently if the yield is recursive.
//-----------------------------------------------------------------------------
bool wxYieldIfNeeded()
{
if (gs_inYield)
return FALSE;
return wxYield();
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxWakeUpIdle // wxWakeUpIdle
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -855,12 +855,22 @@ void wxCYield()
} }
// Yield to other processes // Yield to other processes
static bool gs_inYield = FALSE;
bool wxYield() bool wxYield()
{ {
#if wxUSE_THREADS #ifdef __WXDEBUG__
YieldToAnyThread() ; if (gs_inYield)
wxFAIL_MSG( wxT("wxYield called recursively" ) );
#endif #endif
EventRecord event ;
gs_inYield = TRUE;
#if wxUSE_THREADS
YieldToAnyThread() ;
#endif
EventRecord event ;
long sleepTime = 0 ; //::GetCaretTime(); long sleepTime = 0 ; //::GetCaretTime();
@ -870,7 +880,19 @@ bool wxYield()
} }
wxMacProcessNotifierAndPendingEvents() ; wxMacProcessNotifierAndPendingEvents() ;
return TRUE;
gs_inYield = FALSE;
return TRUE;
}
// Yield to incoming messages; but fail silently if recursion is detected.
bool wxYieldIfNeeded()
{
if (gs_inYield)
return FALSE;
return wxYield();
} }
// platform specifics // platform specifics

View File

@ -855,12 +855,22 @@ void wxCYield()
} }
// Yield to other processes // Yield to other processes
static bool gs_inYield = FALSE;
bool wxYield() bool wxYield()
{ {
#if wxUSE_THREADS #ifdef __WXDEBUG__
YieldToAnyThread() ; if (gs_inYield)
wxFAIL_MSG( wxT("wxYield called recursively" ) );
#endif #endif
EventRecord event ;
gs_inYield = TRUE;
#if wxUSE_THREADS
YieldToAnyThread() ;
#endif
EventRecord event ;
long sleepTime = 0 ; //::GetCaretTime(); long sleepTime = 0 ; //::GetCaretTime();
@ -870,7 +880,19 @@ bool wxYield()
} }
wxMacProcessNotifierAndPendingEvents() ; wxMacProcessNotifierAndPendingEvents() ;
return TRUE;
gs_inYield = FALSE;
return TRUE;
}
// Yield to incoming messages; but fail silently if recursion is detected.
bool wxYieldIfNeeded()
{
if (gs_inYield)
return FALSE;
return wxYield();
} }
// platform specifics // platform specifics

View File

@ -736,8 +736,18 @@ void wxExit()
} }
// Yield to other processes // Yield to other processes
static bool gs_inYield = FALSE;
bool wxYield() bool wxYield()
{ {
#ifdef __WXDEBUG__
if (gs_inYield)
wxFAIL_MSG( wxT("wxYield called recursively" ) );
#endif
gs_inYield = TRUE;
while (wxTheApp && wxTheApp->Pending()) while (wxTheApp && wxTheApp->Pending())
wxTheApp->Dispatch(); wxTheApp->Dispatch();
@ -746,9 +756,21 @@ bool wxYield()
XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMAll); XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMAll);
#endif #endif
gs_inYield = FALSE;
return TRUE; return TRUE;
} }
// Yield to incoming messages; but fail silently if recursion is detected.
bool wxYieldIfNeeded()
{
if (gs_inYield)
return FALSE;
return wxYield();
}
// TODO use XmGetPixmap (?) to get the really standard icons! // TODO use XmGetPixmap (?) to get the really standard icons!
#include "wx/generic/info.xpm" #include "wx/generic/info.xpm"

View File

@ -1280,12 +1280,22 @@ void wxExit()
} }
// Yield to incoming messages // Yield to incoming messages
static bool gs_inYield = FALSE;
bool wxYield() bool wxYield()
{ {
// disable log flushing from here because a call to wxYield() shouldn't // disable log flushing from here because a call to wxYield() shouldn't
// normally result in message boxes popping up &c // normally result in message boxes popping up &c
wxLog::Suspend(); wxLog::Suspend();
#ifdef __WXDEBUG__
if (gs_inYield)
wxFAIL_MSG( wxT("wxYield called recursively" ) );
#endif
gs_inYield = TRUE;
// we don't want to process WM_QUIT from here - it should be processed in // we don't want to process WM_QUIT from here - it should be processed in
// the main event loop in order to stop it // the main event loop in order to stop it
MSG msg; MSG msg;
@ -1307,9 +1317,20 @@ bool wxYield()
// let the logs be flashed again // let the logs be flashed again
wxLog::Resume(); wxLog::Resume();
gs_inYield = FALSE;
return TRUE; return TRUE;
} }
// Yield to incoming messages; but fail silently if recursion is detected.
bool wxYieldIfNeeded()
{
if (gs_inYield)
return FALSE;
return wxYield();
}
bool wxHandleFatalExceptions(bool doit) bool wxHandleFatalExceptions(bool doit)
{ {
#if wxUSE_ON_FATAL_EXCEPTION #if wxUSE_ON_FATAL_EXCEPTION