wxgui: better fix for universal message-level exception handling.

git-svn-id: http://pcsx2.googlecode.com/svn/branches/wxgui@1728 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
Jake.Stine 2009-09-02 12:12:04 +00:00
parent f7a44a7af2
commit 1ebfee30e9
4 changed files with 26 additions and 77 deletions

View File

@ -544,24 +544,24 @@ Exception::PluginLoadError::PluginLoadError( PluginsEnum_t pid, const wxString&
wxString Exception::PluginLoadError::FormatDiagnosticMessage() const
{
return wxsFormat( m_message_diag, tbl_PluginInfo[PluginId].GetShortname() ) +
return wxsFormat( m_message_diag, tbl_PluginInfo[PluginId].GetShortname().c_str() ) +
L"\n\n" + StreamName;
}
wxString Exception::PluginLoadError::FormatDisplayMessage() const
{
return wxsFormat( m_message_user, tbl_PluginInfo[PluginId].GetShortname() ) +
return wxsFormat( m_message_user, tbl_PluginInfo[PluginId].GetShortname().c_str() ) +
L"\n\n" + StreamName;
}
wxString Exception::PluginError::FormatDiagnosticMessage() const
{
return wxsFormat( m_message_diag, tbl_PluginInfo[PluginId].GetShortname() );
return wxsFormat( m_message_diag, tbl_PluginInfo[PluginId].GetShortname().c_str() );
}
wxString Exception::PluginError::FormatDisplayMessage() const
{
return wxsFormat( m_message_user, tbl_PluginInfo[PluginId].GetShortname() );
return wxsFormat( m_message_user, tbl_PluginInfo[PluginId].GetShortname().c_str() );
}
//////////////////////////////////////////////////////////////////////////////////////////
@ -698,14 +698,13 @@ static bool OpenPlugin_CDVD()
static bool OpenPlugin_GS()
{
if( !mtgsThread->IsSelf() )
if( mtgsThread == NULL )
{
if( mtgsThread == NULL )
mtgsOpen(); // mtgsOpen raises its own exception on error
mtgsOpen(); // mtgsOpen raises its own exception on error
return true;
}
else
if( mtgsThread->IsSelf() )
return !GSopen( (void*)&pDsp, "PCSX2", renderswitch ? 2 : 1 );
// Note: rederswitch is us abusing the isMultiThread parameter for that so

View File

@ -181,7 +181,7 @@ protected:
void CleanupMess();
void OpenWizardConsole();
int MainLoop();
void HandleEvent(wxEvtHandler *handler, wxEventFunction func, wxEvent& event) const;
// ----------------------------------------------------------------------------
// Override wx default exception handling behavior

View File

@ -577,7 +577,7 @@ namespace Console
// [TODO] make this a configurable option? Do we care? :)
#ifdef __LINUX__
// puts does automatic newlines, which we don't want here
fputs( L"PCSX2 > ", stdout );
fputs( "PCSX2 > ", stdout );
fputs( src, stdout );
#endif

View File

@ -307,78 +307,28 @@ void Pcsx2App::CleanupMess()
safe_delete( g_Conf );
}
static int pxRunningEventLoopCount = 0;
class pxEvtLoop : public wxEventLoop
void Pcsx2App::HandleEvent(wxEvtHandler *handler, wxEventFunction func, wxEvent& event) const
{
protected:
struct pxRunningEventLoopCounter
try
{
pxRunningEventLoopCounter() { pxRunningEventLoopCount++; }
~pxRunningEventLoopCounter() { pxRunningEventLoopCount--; }
};
public:
virtual int Run()
{
// event loops are not recursive, you need to create another loop!
wxCHECK_MSG( !IsRunning(), -1, _T("can't reenter a message loop") );
wxEventLoopActivator activate(wx_static_cast(wxEventLoop *, this));
#if defined(__WXMSW__) && wxUSE_THREADS
pxRunningEventLoopCounter evtLoopCounter;
#endif // __WXMSW__
while( true )
{
try
{
while( !m_shouldExit )
{
// give ourselves the possibility to do whatever we want!
OnNextIteration();
while( Pending() )
{
if( !Dispatch() )
{
m_shouldExit = true;
break;
}
}
if( wxTheApp )
wxTheApp->ProcessIdle();
}
break;
}
// ----------------------------------------------------------------------------
catch( Exception::PluginError& ex )
{
}
// ----------------------------------------------------------------------------
catch( Exception::RuntimeError& ex )
{
// Runtime errors which have been unhandled should still be safe to recover from,
// so lets issue a message to the user and then continue the message pump.
Console::Error( ex.FormatDiagnosticMessage() );
Msgbox::Alert( ex.FormatDisplayMessage() );
}
}
(handler->*func)(event);
}
};
// ----------------------------------------------------------------------------
catch( Exception::PluginError& ex )
{
}
// ----------------------------------------------------------------------------
catch( Exception::RuntimeError& ex )
{
// Runtime errors which have been unhandled should still be safe to recover from,
// so lets issue a message to the user and then continue the message pump.
// This overload performs universal exception handling for specific types of recoverable
// errors that can be thrown from a multitude of events.
int Pcsx2App::MainLoop()
{
assert( m_mainLoop == NULL );
m_mainLoop = new pxEvtLoop();
return m_mainLoop->Run();
Console::Error( ex.FormatDiagnosticMessage() );
Msgbox::Alert( ex.FormatDisplayMessage() );
}
}
// Common exit handler which can be called from any event (though really it should
// be called only from CloseWindow handlers since that's the more appropriate way
// to handle window closures)