changeset 13677:f27573828e92

Properly implemented shutdown of callback thread.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Sun, 25 Sep 2011 18:29:24 +0200
parents 6cf48511e735
children 117ae3cb156e
files gui/src/HistoryDockWidget.h gui/src/backend/OctaveCallbackThread.cpp gui/src/backend/OctaveCallbackThread.h gui/src/backend/OctaveLink.cpp
diffstat 4 files changed, 31 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/gui/src/HistoryDockWidget.h	Sun Sep 25 11:48:47 2011 +0200
+++ b/gui/src/HistoryDockWidget.h	Sun Sep 25 18:29:24 2011 +0200
@@ -39,7 +39,7 @@
 signals:
   void information (QString message);
   void commandDoubleClicked (QString command);
-  /** Custom signal that tells if a user has clicke away that dock widget. */
+  /** Custom signal that tells if a user has clicked away that dock widget. */
   void activeChanged (bool active);
 protected:
   void closeEvent (QCloseEvent *event);
--- a/gui/src/backend/OctaveCallbackThread.cpp	Sun Sep 25 11:48:47 2011 +0200
+++ b/gui/src/backend/OctaveCallbackThread.cpp	Sun Sep 25 18:29:24 2011 +0200
@@ -18,17 +18,33 @@
 #include "OctaveCallbackThread.h"
 #include "MainWindow.h"
 
-OctaveCallbackThread::OctaveCallbackThread (QObject * parent):QThread (parent)
+OctaveCallbackThread::OctaveCallbackThread (QObject * parent)
+  : QThread (parent)
 {
+  m_runningSemaphore = new QSemaphore(1);
+  m_running = true;
+}
+
+void
+OctaveCallbackThread::halt ()
+{
+  m_runningSemaphore->acquire ();
+  m_running = false;
+  m_runningSemaphore->release ();
 }
 
 void
 OctaveCallbackThread::run ()
 {
-  while (1)
+  bool running = true;
+  while (running)
     {
       OctaveLink::instance ()->fetchSymbolTable ();
       OctaveLink::instance ()->updateHistoryModel ();
       usleep (500000);
+
+      m_runningSemaphore->acquire ();
+      running = m_running;
+      m_runningSemaphore->release ();
     }
 }
--- a/gui/src/backend/OctaveCallbackThread.h	Sun Sep 25 11:48:47 2011 +0200
+++ b/gui/src/backend/OctaveCallbackThread.h	Sun Sep 25 18:29:24 2011 +0200
@@ -19,15 +19,19 @@
 #define OCTAVECALLBACKTHREAD_H
 
 #include <QThread>
+#include <QSemaphore>
 
 class OctaveCallbackThread:public QThread
 {
   Q_OBJECT
 public:
+  void halt();
   OctaveCallbackThread (QObject * parent);
 protected:
   void run ();
-
+private:
+  QSemaphore *m_runningSemaphore;
+  bool m_running;
 };
 
 #endif // OCTAVECALLBACKTHREAD_H
--- a/gui/src/backend/OctaveLink.cpp	Sun Sep 25 11:48:47 2011 +0200
+++ b/gui/src/backend/OctaveLink.cpp	Sun Sep 25 18:29:24 2011 +0200
@@ -91,17 +91,21 @@
 void
 OctaveLink::launchOctave ()
 {
+  // Create both threads.
   m_octaveMainThread = new OctaveMainThread (this);
-  m_octaveMainThread->start ();
+  m_octaveCallbackThread = new OctaveCallbackThread (this);
 
-  m_octaveCallbackThread = new OctaveCallbackThread (this);
+  // Launch the second as soon as the first ist ready.
   connect (m_octaveMainThread, SIGNAL(ready()), m_octaveCallbackThread, SLOT(start()));
+
+  // Start the first one.
+  m_octaveMainThread->start ();
 }
 
 void
 OctaveLink::terminateOctave ()
 {
-  m_octaveCallbackThread->terminate ();
+  m_octaveCallbackThread->halt();
   m_octaveCallbackThread->wait ();
 
   m_octaveMainThread->terminate ();