X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/53ff8df7d54cd427674fc9bffb748c8872c0d658..14619f10b0bdb630206607abd0ce0319d45e095a:/samples/thread/thread.cpp diff --git a/samples/thread/thread.cpp b/samples/thread/thread.cpp index d8d10716c0..7948c35a47 100644 --- a/samples/thread/thread.cpp +++ b/samples/thread/thread.cpp @@ -6,7 +6,7 @@ // Created: 06/16/98 // RCS-ID: $Id$ // Copyright: (c) 1998-2009 wxWidgets team -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -351,35 +351,35 @@ MyFrame::MyFrame(const wxString& title) { 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); @@ -479,7 +479,7 @@ MyFrame::DoLogRecord(wxLogLevel level, wxDateTime(info.timestamp).FormatISOTime(), info.threadId == wxThread::GetMainId() ? wxString("main") - : wxString::Format("%x", info.threadId), + : wxString::Format("%lx", info.threadId), msg + "\n" ); } @@ -537,8 +537,8 @@ void MyFrame::OnStartThreads(wxCommandEvent& WXUNUSED(event) ) { 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; @@ -559,11 +559,11 @@ void MyFrame::OnStartThreads(wxCommandEvent& WXUNUSED(event) ) // 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); } @@ -591,12 +591,14 @@ void MyFrame::OnStartThread(wxCommandEvent& WXUNUSED(event) ) } #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 @@ -606,10 +608,18 @@ void MyFrame::OnStopThread(wxCommandEvent& WXUNUSED(event) ) } 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 } } @@ -632,7 +642,7 @@ void MyFrame::OnResumeThread(wxCommandEvent& WXUNUSED(event) ) wxGetApp().m_threads[n]->Resume(); #if wxUSE_STATUSBAR - SetStatusText(_T("Thread resumed."), 1); + SetStatusText(wxT("Thread resumed."), 1); #endif // wxUSE_STATUSBAR } } @@ -655,7 +665,7 @@ void MyFrame::OnPauseThread(wxCommandEvent& WXUNUSED(event) ) wxGetApp().m_threads[n]->Pause(); #if wxUSE_STATUSBAR - SetStatusText(_T("Thread paused."), 1); + SetStatusText(wxT("Thread paused."), 1); #endif // wxUSE_STATUSBAR } } @@ -697,15 +707,15 @@ void MyFrame::OnShowCPUs(wxCommandEvent& WXUNUSED(event)) 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: @@ -718,11 +728,11 @@ void MyFrame::OnShowCPUs(wxCommandEvent& WXUNUSED(event)) 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) 2000 Robert Roebling\n") - _T("(c) 1999,2009 Vadim Zeitlin"), - _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(); @@ -750,8 +760,8 @@ void MyFrame::OnStartWorker(wxCommandEvent& WXUNUSED(event)) 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 | @@ -969,7 +979,7 @@ wxThread::ExitCode MyWorkerThread::Entry() 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() ); @@ -984,7 +994,7 @@ wxThread::ExitCode MyWorkerThread::Entry() 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 @@ -993,7 +1003,7 @@ wxThread::ExitCode MyWorkerThread::Entry() 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 @@ -1043,7 +1053,7 @@ wxThread::ExitCode MyGUIThread::Entry() 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() );