// Modified by:
// Created: 06/16/98
// RCS-ID: $Id$
-// Copyright: (c) 1998-2002 wxWidgets team
-// Licence: wxWindows license
+// Copyright: (c) 1998-2009 wxWidgets team
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
{
m_oldLogger = wxLog::GetActiveTarget();
- SetIcon(wxIcon(sample_xpm));
+ SetIcon(wxICON(sample));
// Make a menubar
wxMenuBar *menuBar = new wxMenuBar;
wxMenu *menuFile = new wxMenu;
- menuFile->Append(THREAD_CLEAR, _T("&Clear log\tCtrl-L"));
+ menuFile->Append(THREAD_CLEAR, wxT("&Clear log\tCtrl-L"));
menuFile->AppendSeparator();
- menuFile->Append(THREAD_QUIT, _T("E&xit\tAlt-X"));
- menuBar->Append(menuFile, _T("&File"));
+ menuFile->Append(THREAD_QUIT, wxT("E&xit\tAlt-X"));
+ menuBar->Append(menuFile, wxT("&File"));
wxMenu *menuThread = new wxMenu;
- menuThread->Append(THREAD_START_THREAD, _T("&Start a new thread\tCtrl-N"));
- menuThread->Append(THREAD_START_THREADS, _T("Start &many threads at once"));
- menuThread->Append(THREAD_STOP_THREAD, _T("S&top the last spawned thread\tCtrl-S"));
+ menuThread->Append(THREAD_START_THREAD, wxT("&Start a new thread\tCtrl-N"));
+ menuThread->Append(THREAD_START_THREADS, wxT("Start &many threads at once"));
+ menuThread->Append(THREAD_STOP_THREAD, wxT("S&top the last spawned thread\tCtrl-S"));
menuThread->AppendSeparator();
- menuThread->Append(THREAD_PAUSE_THREAD, _T("&Pause the last spawned running thread\tCtrl-P"));
- menuThread->Append(THREAD_RESUME_THREAD, _T("&Resume the first suspended thread\tCtrl-R"));
+ menuThread->Append(THREAD_PAUSE_THREAD, wxT("&Pause the last spawned running thread\tCtrl-P"));
+ menuThread->Append(THREAD_RESUME_THREAD, wxT("&Resume the first suspended thread\tCtrl-R"));
menuThread->AppendSeparator();
- menuThread->Append(THREAD_START_WORKER, _T("Start a &worker thread\tCtrl-W"));
- menuThread->Append(THREAD_EXEC_MAIN, _T("&Launch a program from main thread\tF5"));
- menuThread->Append(THREAD_START_GUI_THREAD, _T("Launch a &GUI thread\tF6"));
- menuBar->Append(menuThread, _T("&Thread"));
+ menuThread->Append(THREAD_START_WORKER, wxT("Start a &worker thread\tCtrl-W"));
+ menuThread->Append(THREAD_EXEC_MAIN, wxT("&Launch a program from main thread\tF5"));
+ menuThread->Append(THREAD_START_GUI_THREAD, wxT("Launch a &GUI thread\tF6"));
+ menuBar->Append(menuThread, wxT("&Thread"));
wxMenu *menuHelp = new wxMenu;
- menuHelp->Append(THREAD_SHOWCPUS, _T("&Show CPU count"));
+ menuHelp->Append(THREAD_SHOWCPUS, wxT("&Show CPU count"));
menuHelp->AppendSeparator();
- menuHelp->Append(THREAD_ABOUT, _T("&About..."));
- menuBar->Append(menuHelp, _T("&Help"));
+ menuHelp->Append(THREAD_ABOUT, wxT("&About"));
+ menuBar->Append(menuHelp, wxT("&Help"));
SetMenuBar(menuBar);
wxDateTime(info.timestamp).FormatISOTime(),
info.threadId == wxThread::GetMainId()
? wxString("main")
- : wxString::Format("%x", info.threadId),
+ : wxString::Format("%lx", info.threadId),
msg + "\n"
);
}
{
static long s_num;
- s_num = wxGetNumberFromUser(_T("How many threads to start: "), _T(""),
- _T("wxThread sample"), s_num, 1, 10000, this);
+ s_num = wxGetNumberFromUser(wxT("How many threads to start: "), wxT(""),
+ wxT("wxThread sample"), s_num, 1, 10000, this);
if ( s_num == -1 )
{
s_num = 10;
// have the lowest priority, the second - the highest, all the rest
// the normal one
if ( n == 0 )
- thr->SetPriority(WXTHREAD_MIN_PRIORITY);
+ thr->SetPriority(wxPRIORITY_MIN);
else if ( n == 1 )
- thr->SetPriority(WXTHREAD_MAX_PRIORITY);
+ thr->SetPriority(wxPRIORITY_MAX);
else
- thr->SetPriority(WXTHREAD_DEFAULT_PRIORITY);
+ thr->SetPriority(wxPRIORITY_DEFAULT);
threads.Add(thr);
}
}
#if wxUSE_STATUSBAR
- SetStatusText(_T("New thread started."), 1);
+ SetStatusText(wxT("New thread started."), 1);
#endif // wxUSE_STATUSBAR
}
void MyFrame::OnStopThread(wxCommandEvent& WXUNUSED(event) )
{
+ wxThread* toDelete = NULL;
+ {
wxCriticalSectionLocker enter(wxGetApp().m_critsect);
// stop the last thread
}
else
{
- wxGetApp().m_threads.Last()->Delete();
+ toDelete = wxGetApp().m_threads.Last();
+ }
+ }
+
+ if ( toDelete )
+ {
+ // This can still crash if the thread gets to delete itself
+ // in the mean time.
+ toDelete->Delete();
#if wxUSE_STATUSBAR
- SetStatusText(_T("Last thread stopped."), 1);
+ SetStatusText(wxT("Last thread stopped."), 1);
#endif // wxUSE_STATUSBAR
}
}
wxGetApp().m_threads[n]->Resume();
#if wxUSE_STATUSBAR
- SetStatusText(_T("Thread resumed."), 1);
+ SetStatusText(wxT("Thread resumed."), 1);
#endif // wxUSE_STATUSBAR
}
}
wxGetApp().m_threads[n]->Pause();
#if wxUSE_STATUSBAR
- SetStatusText(_T("Thread paused."), 1);
+ SetStatusText(wxT("Thread paused."), 1);
#endif // wxUSE_STATUSBAR
}
}
switch ( nCPUs )
{
case -1:
- msg = _T("Unknown number of CPUs");
+ msg = wxT("Unknown number of CPUs");
break;
case 0:
- msg = _T("WARNING: you're running without any CPUs!");
+ msg = wxT("WARNING: you're running without any CPUs!");
break;
case 1:
- msg = _T("This system only has one CPU.");
+ msg = wxT("This system only has one CPU.");
break;
default:
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
{
wxMessageDialog dialog(this,
- _T("wxWidgets multithreaded application sample\n")
- _T("(c) 1998 Julian Smart, Guilhem Lavaux\n")
- _T("(c) 1999 Vadim Zeitlin\n")
- _T("(c) 2000 Robert Roebling"),
- _T("About wxThread sample"),
+ wxT("wxWidgets multithreaded application sample\n")
+ wxT("(c) 1998 Julian Smart, Guilhem Lavaux\n")
+ wxT("(c) 2000 Robert Roebling\n")
+ wxT("(c) 1999,2009 Vadim Zeitlin"),
+ wxT("About wxThread sample"),
wxOK | wxICON_INFORMATION);
dialog.ShowModal();
m_dlgProgress = new wxProgressDialog
(
- _T("Progress dialog"),
- _T("Wait until the thread terminates or press [Cancel]"),
+ wxT("Progress dialog"),
+ wxT("Wait until the thread terminates or press [Cancel]"),
100,
this,
wxPD_CAN_ABORT |
void MyFrame::OnStartGUIThread(wxCommandEvent& WXUNUSED(event))
{
+ // we use this to check that disabling logging only affects the main thread
+ // but the messages from the worker thread will still be logged
+ wxLogNull noLog;
+ wxLogMessage("You shouldn't see this message because of wxLogNull");
+
MyImageDialog dlg(this);
dlg.ShowModal();
if ( TestDestroy() )
return NULL;
- wxThreadEvent event( wxEVT_COMMAND_THREAD, WORKER_EVENT );
+ wxThreadEvent event( wxEVT_THREAD, WORKER_EVENT );
event.SetInt( 50 );
wxQueueEvent( m_frame, event.Clone() );
break;
// create any type of command event here
- wxThreadEvent event( wxEVT_COMMAND_THREAD, WORKER_EVENT );
+ wxThreadEvent event( wxEVT_THREAD, WORKER_EVENT );
event.SetInt( m_count );
// send in a thread-safe way
wxMilliSleep(200);
}
- wxThreadEvent event( wxEVT_COMMAND_THREAD, WORKER_EVENT );
+ wxThreadEvent event( wxEVT_THREAD, WORKER_EVENT );
event.SetInt(-1); // that's all
wxQueueEvent( m_frame, event.Clone() );
#endif
wxThread::ExitCode MyGUIThread::Entry()
{
+ // uncomment this to check that disabling logging here does disable it for
+ // this thread -- but not the main one if you also comment out wxLogNull
+ // line in MyFrame::OnStartGUIThread()
+ //wxLogNull noLog;
+
+ // this goes to the main window
+ wxLogMessage("GUI thread starting");
+
+ // use a thread-specific log target for this thread to show that its
+ // messages don't appear in the main window while it runs
+ wxLogBuffer logBuf;
+ wxLog::SetThreadActiveTarget(&logBuf);
+
for (int i=0; i<GUITHREAD_NUM_UPDATES && !TestDestroy(); i++)
{
// inform the GUI toolkit that we're going to use GUI functions
wxMutexGuiLeave();
// notify the dialog that another piece of our masterpiece is complete:
- wxThreadEvent event( wxEVT_COMMAND_THREAD, GUITHREAD_EVENT );
+ wxThreadEvent event( wxEVT_THREAD, GUITHREAD_EVENT );
event.SetInt(i+1);
wxQueueEvent( m_dlg, event.Clone() );
+ if ( !((i + 1) % 10) )
+ {
+ // this message will go to the buffer
+ wxLogMessage("Step #%d.", i + 1);
+ }
+
// give the main thread the time to refresh before we lock the GUI mutex again
// FIXME: find a better way to do this!
wxMilliSleep(100);
}
+ // now remove the thread-specific thread target
+ wxLog::SetThreadActiveTarget(NULL);
+
+ // so that this goes to the main window again
+ wxLogMessage("GUI thread finished.");
+
return (ExitCode)0;
}