X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5ceb93670ce69045f5dcc9bf4599d3942abdd164..14619f10b0bdb630206607abd0ce0319d45e095a:/samples/except/except.cpp?ds=sidebyside diff --git a/samples/except/except.cpp b/samples/except/except.cpp index f225369234..1cb291eeb5 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 // ---------------------------------------------------------------------------- @@ -51,7 +53,7 @@ // ---------------------------------------------------------------------------- // the application icon (under Windows and OS/2 it is in resources) -#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__) +#ifndef wxHAS_IMAGES_IN_RESOURCES #include "../sample.xpm" #endif @@ -118,6 +120,7 @@ public: void OnThrowUnhandled(wxCommandEvent& event); void OnCrash(wxCommandEvent& event); + void OnTrap(wxCommandEvent& event); #if wxUSE_ON_FATAL_EXCEPTION void OnHandleCrash(wxCommandEvent& event); #endif @@ -128,8 +131,13 @@ protected: // catch exceptions which occur in MyFrame methods here virtual bool ProcessEvent(wxEvent& event); - // 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); +#if wxUSE_THREADS + void OnShowAssertInThread(wxCommandEvent& event); +#endif // wxUSE_THREADS private: // any class wishing to process wxWidgets events must use this macro @@ -181,10 +189,14 @@ enum Except_ThrowObject, Except_ThrowUnhandled, Except_Crash, + Except_Trap, #if wxUSE_ON_FATAL_EXCEPTION Except_HandleCrash, #endif // wxUSE_ON_FATAL_EXCEPTION Except_ShowAssert, +#if wxUSE_THREADS + Except_ShowAssertInThread, +#endif // wxUSE_THREADS Except_Dialog, Except_Quit = wxID_EXIT, @@ -207,10 +219,14 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(Except_ThrowObject, MyFrame::OnThrowObject) EVT_MENU(Except_ThrowUnhandled, MyFrame::OnThrowUnhandled) EVT_MENU(Except_Crash, MyFrame::OnCrash) + EVT_MENU(Except_Trap, MyFrame::OnTrap) #if wxUSE_ON_FATAL_EXCEPTION EVT_MENU(Except_HandleCrash, MyFrame::OnHandleCrash) #endif // wxUSE_ON_FATAL_EXCEPTION EVT_MENU(Except_ShowAssert, MyFrame::OnShowAssert) +#if wxUSE_THREADS + EVT_MENU(Except_ShowAssertInThread, MyFrame::OnShowAssertInThread) +#endif // wxUSE_THREADS END_EVENT_TABLE() BEGIN_EVENT_TABLE(MyDialog, wxDialog) @@ -301,14 +317,17 @@ void MyApp::OnAssertFailure(const wxChar *file, const wxChar *cond, const wxChar *msg) { - if ( 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 ) + // 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); } @@ -337,17 +356,23 @@ MyFrame::MyFrame() menuFile->Append(Except_ThrowUnhandled, wxT("Throw &unhandled exception\tCtrl-U")); menuFile->Append(Except_Crash, wxT("&Crash\tCtrl-C")); + menuFile->Append(Except_Trap, "&Trap\tCtrl-T", + "Break into the debugger (if one is running)"); menuFile->AppendSeparator(); #if wxUSE_ON_FATAL_EXCEPTION menuFile->AppendCheckItem(Except_HandleCrash, wxT("&Handle crashes\tCtrl-H")); menuFile->AppendSeparator(); #endif // wxUSE_ON_FATAL_EXCEPTION 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(); menuFile->Append(Except_Quit, wxT("E&xit\tCtrl-Q"), wxT("Quit this program")); wxMenu *helpMenu = new wxMenu; - helpMenu->Append(Except_About, wxT("&About...\tF1"), wxT("Show about dialog")); + helpMenu->Append(Except_About, wxT("&About\tF1"), wxT("Show about dialog")); // now append the freshly created menu to the menu bar... wxMenuBar *menuBar = new wxMenuBar(); @@ -427,6 +452,11 @@ void MyFrame::OnCrash(wxCommandEvent& WXUNUSED(event)) DoCrash(); } +void MyFrame::OnTrap(wxCommandEvent& WXUNUSED(event)) +{ + wxTrap(); +} + #if wxUSE_ON_FATAL_EXCEPTION void MyFrame::OnHandleCrash(wxCommandEvent& event) @@ -443,6 +473,35 @@ void MyFrame::OnShowAssert(wxCommandEvent& WXUNUSED(event)) arr[0]; } +#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)) { wxString msg;