Mercurial > hg > octave-terminal
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 +++ b/gui/src/HistoryDockWidget.h @@ -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 +++ b/gui/src/backend/OctaveCallbackThread.cpp @@ -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 +++ b/gui/src/backend/OctaveCallbackThread.h @@ -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 +++ b/gui/src/backend/OctaveLink.cpp @@ -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 ();