#include "wx/utils.h"
#include "wx/msgdlg.h"
#include "wx/icon.h"
+
+ #include "wx/thread.h"
#endif
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// the application icon (under Windows and OS/2 it is in resources)
-#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
+#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)
#include "../sample.xpm"
#endif
// 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
Except_HandleCrash,
#endif // wxUSE_ON_FATAL_EXCEPTION
Except_ShowAssert,
+#if wxUSE_THREADS
+ Except_ShowAssertInThread,
+#endif // wxUSE_THREADS
Except_Dialog,
Except_Quit = wxID_EXIT,
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)
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->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();
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;