]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/thread/thread.cpp
fix bug
[wxWidgets.git] / samples / thread / thread.cpp
index 3e65bde45dac7e150e889b1e7391b1c6b2af64ca..dd421d794dce67150dc52e49ee8143c1c5f37bc4 100644 (file)
@@ -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,29 +407,76 @@ 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;
 
     m_dlgProgress = (wxProgressDialog *)NULL;
 
+#if wxUSE_STATUSBAR
     CreateStatusBar(2);
+#endif // wxUSE_STATUSBAR
 
-    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);
@@ -478,9 +527,11 @@ void MyFrame::OnStartThreads(wxCommandEvent& WXUNUSED(event) )
         threads.Add(thr);
     }
 
+#if wxUSE_STATUSBAR
     wxString msg;
     msg.Printf(wxT("%d new threads created."), count);
     SetStatusText(msg, 1);
+#endif // wxUSE_STATUSBAR
 
     // ...and then start them
     for ( n = 0; n < count; n++ )
@@ -498,7 +549,9 @@ void MyFrame::OnStartThread(wxCommandEvent& WXUNUSED(event) )
         wxLogError(wxT("Can't start thread!"));
     }
 
+#if wxUSE_STATUSBAR
     SetStatusText(_T("New thread started."), 1);
+#endif // wxUSE_STATUSBAR
 }
 
 void MyFrame::OnStopThread(wxCommandEvent& WXUNUSED(event) )
@@ -523,7 +576,9 @@ void MyFrame::OnStopThread(wxCommandEvent& WXUNUSED(event) )
 
         thread->Delete();
 
+#if wxUSE_STATUSBAR
         SetStatusText(_T("Thread stopped."), 1);
+#endif // wxUSE_STATUSBAR
     }
 }
 
@@ -544,7 +599,9 @@ void MyFrame::OnResumeThread(wxCommandEvent& WXUNUSED(event) )
     {
         wxGetApp().m_threads[n]->Resume();
 
+#if wxUSE_STATUSBAR
         SetStatusText(_T("Thread resumed."), 1);
+#endif // wxUSE_STATUSBAR
     }
 }
 
@@ -565,7 +622,9 @@ void MyFrame::OnPauseThread(wxCommandEvent& WXUNUSED(event) )
     {
         wxGetApp().m_threads[n]->Pause();
 
+#if wxUSE_STATUSBAR
         SetStatusText(_T("Thread paused."), 1);
+#endif // wxUSE_STATUSBAR
     }
 }
 
@@ -597,51 +656,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 +703,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 +746,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 +775,7 @@ void MyFrame::OnWorkerEvent(wxCommandEvent& event)
         {
             wxCriticalSectionLocker lock(m_critsectWork);
 
-            m_cancelled = TRUE;
+            m_cancelled = true;
         }
     }
 #endif