X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..7fe5c04d6af25695488d1c6342f3b4fd4de515e5:/samples/except/except.cpp diff --git a/samples/except/except.cpp b/samples/except/except.cpp index ed04aec596..7ea7b7b159 100644 --- a/samples/except/except.cpp +++ b/samples/except/except.cpp @@ -44,6 +44,8 @@ #include "wx/utils.h" #include "wx/msgdlg.h" #include "wx/icon.h" + + #include "wx/thread.h" #endif // ---------------------------------------------------------------------------- @@ -91,14 +93,13 @@ public: // crash (e.g. dereferencing null pointer, division by 0, ...) virtual void OnFatalException(); -#ifdef __WXDEBUG__ - // in debug mode, you can override this function to do something different - // (e.g. log the assert to file) whenever an assertion fails - virtual void OnAssert(const wxChar *file, - int line, - const wxChar *cond, - const wxChar *msg); -#endif // __WXDEBUG__ + // you can override this function to do something different (e.g. log the + // assert to file) whenever an assertion fails + virtual void OnAssertFailure(const wxChar *file, + int line, + const wxChar *func, + const wxChar *cond, + const wxChar *msg); }; // Define a new frame type: this is going to be our main frame @@ -129,10 +130,13 @@ protected: // catch exceptions which occur in MyFrame methods here virtual bool ProcessEvent(wxEvent& event); -#ifdef __WXDEBUG__ - // show how an assert failure message box looks like + // provoke assert in main or worker thread + // + // this is used to show how an assert failure message box looks like void OnShowAssert(wxCommandEvent& event); -#endif // __WXDEBUG__ +#if wxUSE_THREADS + void OnShowAssertInThread(wxCommandEvent& event); +#endif // wxUSE_THREADS private: // any class wishing to process wxWidgets events must use this macro @@ -187,9 +191,10 @@ enum #if wxUSE_ON_FATAL_EXCEPTION Except_HandleCrash, #endif // wxUSE_ON_FATAL_EXCEPTION -#ifdef __WXDEBUG__ Except_ShowAssert, -#endif // __WXDEBUG__ +#if wxUSE_THREADS + Except_ShowAssertInThread, +#endif // wxUSE_THREADS Except_Dialog, Except_Quit = wxID_EXIT, @@ -215,9 +220,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) #if wxUSE_ON_FATAL_EXCEPTION EVT_MENU(Except_HandleCrash, MyFrame::OnHandleCrash) #endif // wxUSE_ON_FATAL_EXCEPTION -#ifdef __WXDEBUG__ EVT_MENU(Except_ShowAssert, MyFrame::OnShowAssert) -#endif // __WXDEBUG__ +#if wxUSE_THREADS + EVT_MENU(Except_ShowAssertInThread, MyFrame::OnShowAssertInThread) +#endif // wxUSE_THREADS END_EVENT_TABLE() BEGIN_EVENT_TABLE(MyDialog, wxDialog) @@ -302,19 +308,28 @@ void MyApp::OnFatalException() wxT("wxExcept Sample"), wxOK | wxICON_ERROR); } -#ifdef __WXDEBUG__ - -void MyApp::OnAssert(const wxChar *file, - int line, - const wxChar *cond, - const wxChar *msg) +void MyApp::OnAssertFailure(const wxChar *file, + int line, + const wxChar *func, + const wxChar *cond, + const wxChar *msg) { - // we don't have anything special to do here - wxApp::OnAssert(file, line, cond, msg); + // take care to not show the message box from a worker thread, this doesn't + // work as it doesn't have any event loop + if ( !wxIsMainThread() || + wxMessageBox + ( + wxString::Format("An assert failed in %s().", func) + + "\n" + "Do you want to call the default assert handler?", + "wxExcept Sample", + wxYES_NO | wxICON_QUESTION + ) == wxYES ) + { + wxApp::OnAssertFailure(file, line, func, cond, msg); + } } -#endif // __WXDEBUG__ - // ============================================================================ // MyFrame implementation // ============================================================================ @@ -343,10 +358,12 @@ MyFrame::MyFrame() menuFile->AppendCheckItem(Except_HandleCrash, wxT("&Handle crashes\tCtrl-H")); menuFile->AppendSeparator(); #endif // wxUSE_ON_FATAL_EXCEPTION -#ifdef __WXDEBUG__ menuFile->Append(Except_ShowAssert, wxT("Provoke &assert failure\tCtrl-A")); +#if wxUSE_THREADS + menuFile->Append(Except_ShowAssertInThread, + wxT("Assert failure in &thread\tShift-Ctrl-A")); +#endif // wxUSE_THREADS menuFile->AppendSeparator(); -#endif // __WXDEBUG__ menuFile->Append(Except_Quit, wxT("E&xit\tCtrl-Q"), wxT("Quit this program")); wxMenu *helpMenu = new wxMenu; @@ -439,8 +456,6 @@ void MyFrame::OnHandleCrash(wxCommandEvent& event) #endif // wxUSE_ON_FATAL_EXCEPTION -#ifdef __WXDEBUG__ - void MyFrame::OnShowAssert(wxCommandEvent& WXUNUSED(event)) { // provoke an assert from wxArrayString @@ -448,7 +463,34 @@ void MyFrame::OnShowAssert(wxCommandEvent& WXUNUSED(event)) arr[0]; } -#endif // __WXDEBUG__ +#if wxUSE_THREADS + +void MyFrame::OnShowAssertInThread(wxCommandEvent& WXUNUSED(event)) +{ + class AssertThread : public wxThread + { + public: + AssertThread() + : wxThread(wxTHREAD_JOINABLE) + { + } + + protected: + virtual void *Entry() + { + wxFAIL_MSG("Test assert in another thread."); + + return 0; + } + }; + + AssertThread thread; + thread.Create(); + thread.Run(); + thread.Wait(); +} + +#endif // wxUSE_THREADS void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) {