#include "wx/utils.h"
#include "wx/msgdlg.h"
#include "wx/icon.h"
+
+ #include "wx/thread.h"
#endif
// ----------------------------------------------------------------------------
// 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
// 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
#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,
#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)
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
// ============================================================================
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;
#endif // wxUSE_ON_FATAL_EXCEPTION
-#ifdef __WXDEBUG__
-
void MyFrame::OnShowAssert(wxCommandEvent& WXUNUSED(event))
{
// provoke an assert from wxArrayString
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))
{