X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/963ac8fbf59fbc3817d573ecd704663e84e0ebf8..da397248d3293b4336ec900e1eeac3d75a62c631:/samples/thread/thread.cpp diff --git a/samples/thread/thread.cpp b/samples/thread/thread.cpp index 3e65bde45d..7a6b0ef5e7 100644 --- a/samples/thread/thread.cpp +++ b/samples/thread/thread.cpp @@ -1,11 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// // Name: thread.cpp -// Purpose: wxWindows thread sample +// Purpose: wxWidgets thread sample // Author: Guilhem Lavaux, Vadim Zeitlin // Modified by: // Created: 06/16/98 // RCS-ID: $Id$ -// Copyright: (c) 1998-2002 wxWindows team +// Copyright: (c) 1998-2002 wxWidgets team // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -26,6 +26,7 @@ #include "wx/thread.h" #include "wx/dynarray.h" +#include "wx/numdlg.h" #include "wx/progdlg.h" @@ -39,7 +40,7 @@ #endif class MyThread; -WX_DEFINE_ARRAY_NO_PTR(wxThread *, wxArrayThread); +WX_DEFINE_ARRAY_PTR(wxThread *, wxArrayThread); // Define a new application type class MyApp : public wxApp @@ -75,6 +76,7 @@ class MyFrame: public wxFrame public: // ctor MyFrame(wxFrame *frame, const wxString& title, int x, int y, int w, int h); + virtual ~MyFrame(); // operations void WriteText(const wxString& text) { m_txtctrl->WriteText(text); } @@ -208,7 +210,7 @@ void MyThread::OnExit() // waiting for us if ( wxGetApp().m_waitingUntilAllDone ) { - wxGetApp().m_waitingUntilAllDone = FALSE; + wxGetApp().m_waitingUntilAllDone = false; wxGetApp().m_semAllDone.Post(); } @@ -353,7 +355,7 @@ END_EVENT_TABLE() MyApp::MyApp() : m_semAllDone() { - m_waitingUntilAllDone = FALSE; + m_waitingUntilAllDone = false; } MyApp::~MyApp() @@ -368,7 +370,7 @@ bool MyApp::OnInit() //wxLog::AddTraceMask("thread"); // Create the main frame window - MyFrame *frame = new MyFrame((wxFrame *)NULL, _T("wxWindows threads sample"), + MyFrame *frame = new MyFrame((wxFrame *)NULL, _T("wxWidgets threads sample"), 50, 50, 450, 340); // Make a menubar @@ -405,17 +407,17 @@ bool MyApp::OnInit() frame->SetMenuBar(menuBar); // Show the frame - frame->Show(TRUE); + frame->Show(true); SetTopWindow(frame); - return TRUE; + return true; } // My frame constructor MyFrame::MyFrame(wxFrame *frame, const wxString& title, int x, int y, int w, int h) - : wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h)) + : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)) { m_nRunning = m_nCount = 0; @@ -423,11 +425,56 @@ MyFrame::MyFrame(wxFrame *frame, const wxString& title, CreateStatusBar(2); - m_txtctrl = new wxTextCtrl(this, -1, _T(""), wxPoint(0, 0), wxSize(0, 0), + m_txtctrl = new wxTextCtrl(this, wxID_ANY, _T(""), wxPoint(0, 0), wxSize(0, 0), wxTE_MULTILINE | wxTE_READONLY); } +MyFrame::~MyFrame() +{ + // NB: although the OS will terminate all the threads anyhow when the main + // one exits, it's good practice to do it ourselves -- even if it's not + // completely trivial in this example + + // tell all the threads to terminate: note that they can't terminate while + // we're deleting them because they will block in their OnExit() -- this is + // important as otherwise we might access invalid array elements + wxThread *thread; + + wxGetApp().m_critsect.Enter(); + + // check if we have any threads running first + const wxArrayThread& threads = wxGetApp().m_threads; + size_t count = threads.GetCount(); + + if ( count ) + { + // set the flag for MyThread::OnExit() + wxGetApp().m_waitingUntilAllDone = true; + + // stop all threads + while ( ! threads.IsEmpty() ) + { + thread = threads.Last(); + + wxGetApp().m_critsect.Leave(); + + thread->Delete(); + + wxGetApp().m_critsect.Enter(); + } + } + + wxGetApp().m_critsect.Leave(); + + if ( count ) + { + // now wait for them to really terminate + wxGetApp().m_semAllDone.Wait(); + } + //else: no threads to terminate, no condition to wait for +} + MyThread *MyFrame::CreateThread() { MyThread *thread = new MyThread(this); @@ -597,51 +644,7 @@ void MyFrame::OnIdle(wxIdleEvent& event) void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) ) { - // NB: although the OS will terminate all the threads anyhow when the main - // one exits, it's good practice to do it ourselves -- even if it's not - // completely trivial in this example - - // tell all the threads to terminate: note that they can't terminate while - // we're deleting them because they will block in their OnExit() -- this is - // important as otherwise we might access invalid array elements - { - wxThread *thread; - - wxGetApp().m_critsect.Enter(); - - // check if we have any threads running first - const wxArrayThread& threads = wxGetApp().m_threads; - size_t count = threads.GetCount(); - - if ( count ) - { - // set the flag for MyThread::OnExit() - wxGetApp().m_waitingUntilAllDone = TRUE; - - // stop all threads - while ( ! threads.IsEmpty() ) - { - thread = threads.Last(); - - wxGetApp().m_critsect.Leave(); - - thread->Delete(); - - wxGetApp().m_critsect.Enter(); - } - } - - wxGetApp().m_critsect.Leave(); - - if ( count ) - { - // now wait for them to really terminate - wxGetApp().m_semAllDone.Wait(); - } - //else: no threads to terminate, no condition to wait for - } - - Close(TRUE); + Close(true); } void MyFrame::OnExecMain(wxCommandEvent& WXUNUSED(event)) @@ -688,7 +691,7 @@ void MyFrame::OnShowCPUs(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) { wxMessageDialog dialog(this, - _T("wxWindows multithreaded application sample\n") + _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"), @@ -731,7 +734,7 @@ void MyFrame::OnStartWorker(wxCommandEvent& WXUNUSED(event)) ); // thread is not running yet, no need for crit sect - m_cancelled = FALSE; + m_cancelled = false; thread->Run(); } @@ -760,7 +763,7 @@ void MyFrame::OnWorkerEvent(wxCommandEvent& event) { wxCriticalSectionLocker lock(m_critsectWork); - m_cancelled = TRUE; + m_cancelled = true; } } #endif