#include "wx/utils.h"
#include "wx/msgdlg.h"
#include "wx/icon.h"
+
+ #include "wx/thread.h"
#endif
// ----------------------------------------------------------------------------
// 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)
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);
}
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))
{