Mercurial > hg > octave-terminal
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 +++ b/gui//src/MainWindow.cpp @@ -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 +++ b/gui//src/MainWindow.h @@ -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