changeset 13391:d5d56d353278

Replaced pthreads by QThreads.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Mon, 11 Apr 2011 13:04:31 +0200
parents ee41454753d4
children b773f4dce153
files gui//src/MainWindow.cpp gui//src/MainWindow.h
diffstat 2 files changed, 100 insertions(+), 75 deletions(-) [+]
line wrap: on
line diff
--- a/gui//src/MainWindow.cpp	Sun Apr 10 23:26:38 2011 +0200
+++ b/gui//src/MainWindow.cpp	Mon Apr 11 13:04:31 2011 +0200
@@ -25,7 +25,7 @@
 
 MainWindow::MainWindow(QWidget *parent)
     : QMainWindow(parent),
-      isRunning(true) {
+      m_isRunning(true) {
     resize(1000, 600);
     constructWindow();
     establishOctaveLink();
@@ -48,8 +48,13 @@
 void MainWindow::establishOctaveLink() {
     //QMetaObject::invokeMethod(this, "setStatus", Q_ARG(QString, QString("Establishing Octave link..")));
     m_octaveLink = new OctaveLink();
-    pthread_create(&m_octaveThread, 0, MainWindow::octaveMainWrapper, this);
-    pthread_create(&m_octaveCallbackThread, 0, MainWindow::octaveCallback, this);
+
+    m_octaveMainThread = new OctaveMainThread(this);
+    m_octaveMainThread->start();
+
+    m_octaveCallbackThread = new OctaveCallbackThread(this, this);
+    m_octaveCallbackThread->start();
+
     command_editor::add_event_hook(server_rl_event_hook_function);
 
     int fdm, fds;
@@ -61,69 +66,3 @@
     dup2 (fds, 2);
     m_octaveTerminal->openTeletype(fdm);
 }
-
-void* MainWindow::octaveMainWrapper(void *widget) {
-    //MainWindow *mainWindow = (MainWindow*)ptr;
-
-    int argc = 3;
-    const char* argv[] = {"octave", "--interactive", "--line-editing"};
-    octave_main(argc, (char**)argv,1);
-    switch_to_buffer(create_buffer(get_input_from_stdin()));
-    main_loop();
-    clean_up_and_exit(0);
-    return 0;
-}
-
-void* MainWindow::octaveCallback(void *widget) {
-    MainWindow *mainWindow = (MainWindow*)widget;
-
-    while(mainWindow->isRunning) {
-
-    // Get a full variable list.
-    std::vector<OctaveLink::VariableMetaData> variables = oct_octave_server.variableInfoList();
-    if(variables.size()) {
-        // TODO: Update variables view.
-    }
-
-    // Check whether any requested variables have been returned.
-    std::vector<OctaveLink::RequestedVariable> reqVars = oct_octave_server.requestedVariables();
-    for(std::vector<OctaveLink::RequestedVariable>::iterator it = reqVars.begin();
-        it != reqVars.end(); it++ ) {
-        // TODO: Process requested variables.
-    }
-
-    // Collect history list.
-    string_vector historyList = oct_octave_server.getHistoryList();
-    if(historyList.length()) {
-        mainWindow->m_historyDockWidget->updateHistory(historyList);
-    }
-
-    // Put a marker in each buffer at the proper location.
-    int status = 0;
-    std::vector<OctaveLink::BreakPoint> breakPoints = oct_octave_server.breakPointList(status);
-    if(status==0) {
-        //MEditor::GetInstance()->process_breakpoint_list (bps);
-    }
-
-    // Find out if a breakpoint is hit
-    static bool lineNumber = -1;
-    bool hitBreakPoint = oct_octave_server.isBreakpointReached(status);
-    if((status==0) && hitBreakPoint) {
-        std::vector<OctaveLink::BreakPoint> hit_breakpoint = oct_octave_server.reachedBreakpoint();
-
-        if(hit_breakpoint.size() > 0 && (hit_breakpoint[0].lineNumber != lineNumber)) {
-            //MEditor::GetInstance()->remove_hit_breakpoint_marker ();
-            //MEditor::GetInstance()->add_breakpoint_marker(hit_breakpoint[0], BP_MARKER_TYPE_HIT);
-            lineNumber = hit_breakpoint[0].lineNumber;
-        }
-    }
-    else if((status==0) && lineNumber>0) {
-        //MEditor::GetInstance()->remove_hit_breakpoint_marker ();
-        lineNumber = -1;
-    }
-
-        usleep(100000);
-    }
-
-    return 0;
-}
--- a/gui//src/MainWindow.h	Sun Apr 10 23:26:38 2011 +0200
+++ b/gui//src/MainWindow.h	Mon Apr 11 13:04:31 2011 +0200
@@ -20,6 +20,7 @@
 #define MAINWINDOW_H
 
 #include <QtGui/QMainWindow>
+#include <QThread>
 #include "OctaveTerminal.h"
 #include "OctaveLink.h"
 #include "VariablesDockWidget.h"
@@ -67,6 +68,10 @@
 #include <iostream>
 #include <vector>
 #include "pty.h"
+
+class OctaveMainThread;
+class OctaveCallbackThread;
+
 /**
   * \class MainWindow
   *
@@ -76,12 +81,14 @@
 {
     Q_OBJECT
 public:
-    static void* octaveMainWrapper(void *widget);
-    static void* octaveCallback(void *widget);
-
     MainWindow(QWidget *parent = 0);
     ~MainWindow();
 
+    bool isRunning() { return m_isRunning; }
+    OctaveTerminal *octaveTerminal() { return m_octaveTerminal; }
+    VariablesDockWidget *variablesDockWidget() { return m_variablesDockWidget; }
+    HistoryDockWidget *historyDockWidget() { return m_historyDockWidget; }
+
 public slots:
 private:
     void constructWindow();
@@ -92,9 +99,88 @@
 
     // Threads for running octave and managing the data interaction.
     OctaveLink *m_octaveLink;
-    pthread_t m_octaveThread;
-    pthread_t m_octaveCallbackThread;
-    bool isRunning;
+    OctaveMainThread *m_octaveMainThread;
+    OctaveCallbackThread *m_octaveCallbackThread;
+    bool m_isRunning;
+};
+
+class OctaveMainThread : public QThread {
+    Q_OBJECT
+public:
+    OctaveMainThread(QObject *parent)
+        : QThread(parent) {
+    }
+protected:
+    void run() {
+        int argc = 3;
+        const char* argv[] = {"octave", "--interactive", "--line-editing"};
+        octave_main(argc, (char**)argv,1);
+        switch_to_buffer(create_buffer(get_input_from_stdin()));
+        main_loop();
+        clean_up_and_exit(0);
+    }
+};
+
+class OctaveCallbackThread : public QThread {
+    Q_OBJECT
+public:
+    OctaveCallbackThread(QObject *parent, MainWindow *mainWindow)
+        : QThread(parent),
+          m_mainWindow(mainWindow) {
+    }
+
+protected:
+    void run() {
+        while(m_mainWindow->isRunning()) {
+
+        // Get a full variable list.
+        std::vector<OctaveLink::VariableMetaData> variables = oct_octave_server.variableInfoList();
+        if(variables.size()) {
+            // TODO: Update variables view.
+        }
+
+        // Check whether any requested variables have been returned.
+        std::vector<OctaveLink::RequestedVariable> reqVars = oct_octave_server.requestedVariables();
+        for(std::vector<OctaveLink::RequestedVariable>::iterator it = reqVars.begin();
+            it != reqVars.end(); it++ ) {
+            // TODO: Process requested variables.
+        }
+
+        // Collect history list.
+        string_vector historyList = oct_octave_server.getHistoryList();
+        if(historyList.length()) {
+            m_mainWindow->historyDockWidget()->updateHistory(historyList);
+        }
+
+        // Put a marker in each buffer at the proper location.
+        int status = 0;
+        std::vector<OctaveLink::BreakPoint> breakPoints = oct_octave_server.breakPointList(status);
+        if(status==0) {
+            //MEditor::GetInstance()->process_breakpoint_list (bps);
+        }
+
+        // Find out if a breakpoint is hit
+        static bool lineNumber = -1;
+        bool hitBreakPoint = oct_octave_server.isBreakpointReached(status);
+        if((status==0) && hitBreakPoint) {
+            std::vector<OctaveLink::BreakPoint> hit_breakpoint = oct_octave_server.reachedBreakpoint();
+
+            if(hit_breakpoint.size() > 0 && (hit_breakpoint[0].lineNumber != lineNumber)) {
+                //MEditor::GetInstance()->remove_hit_breakpoint_marker ();
+                //MEditor::GetInstance()->add_breakpoint_marker(hit_breakpoint[0], BP_MARKER_TYPE_HIT);
+                lineNumber = hit_breakpoint[0].lineNumber;
+            }
+        }
+        else if((status==0) && lineNumber>0) {
+            //MEditor::GetInstance()->remove_hit_breakpoint_marker ();
+            lineNumber = -1;
+        }
+
+            usleep(100000);
+        }
+    }
+private:
+    MainWindow *m_mainWindow;
 };
 
 #endif // MAINWINDOW_H