diff --git a/src/core/tandem_run/tandembatchprocess.cpp b/src/core/tandem_run/tandembatchprocess.cpp index 6a07083ecf9315ec9406d220015e8edab74dff4d..33440c51ab6be473ea14bc6315bfb9b72c9acbb2 100644 --- a/src/core/tandem_run/tandembatchprocess.cpp +++ b/src/core/tandem_run/tandembatchprocess.cpp @@ -33,7 +33,8 @@ #include <QFileInfo> #include <QDebug> -TandemBatchProcess::TandemBatchProcess(WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch) { +TandemBatchProcess::TandemBatchProcess(MainWindow * p_main_window, WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch) { + _p_main_window = p_main_window; _tandem_run_batch = tandem_run_batch; _p_monitor = p_monitor; _tmp_database_file.setAutoRemove(true); @@ -43,6 +44,9 @@ TandemBatchProcess::~TandemBatchProcess() { } bool TandemBatchProcess::shouldIstop() { + if (_p_main_window->stopWorkerThread()) { + return true; + } return false; } void TandemBatchProcess::writeXmlDatabaseFile (QXmlStreamWriter * p_out) { diff --git a/src/core/tandem_run/tandembatchprocess.h b/src/core/tandem_run/tandembatchprocess.h index 0aed96910583b9774c41bd32db266922fa2f2411..7502c4b64c094ea752b872625f9db9982e1548b8 100644 --- a/src/core/tandem_run/tandembatchprocess.h +++ b/src/core/tandem_run/tandembatchprocess.h @@ -33,11 +33,12 @@ #include "../../utils/workmonitor.h" #include <QTemporaryFile> #include <QXmlStreamWriter> +#include "../../gui/mainwindow.h" class TandemBatchProcess { public: - TandemBatchProcess(WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch); + TandemBatchProcess(MainWindow * p_main_window, WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch); virtual ~TandemBatchProcess(); virtual void run(); @@ -45,9 +46,9 @@ protected: void writeXmlDatabaseFile (QXmlStreamWriter * p_out); void writeXmlInputFile (QXmlStreamWriter * p_out, const QString & mz_file); virtual void prepareXmlDatabaseFile(); + bool shouldIstop(); private: void runOne(const QString & mz_file); - bool shouldIstop(); protected: QString _preset_file; @@ -60,6 +61,7 @@ private: QTemporaryFile _tmp_database_file; + MainWindow * _p_main_window=nullptr; }; #endif // TANDEMBATCHPROCESS_H diff --git a/src/core/tandem_run/tandemcondorprocess.cpp b/src/core/tandem_run/tandemcondorprocess.cpp index 3bdaba62954c72204795f2177102bf6c5eedb366..dbb094a403c2c127668ed6a6aaf817fd3e236ffa 100644 --- a/src/core/tandem_run/tandemcondorprocess.cpp +++ b/src/core/tandem_run/tandemcondorprocess.cpp @@ -36,7 +36,7 @@ #include <QThread> #include "../../input/condorqxmlsaxhandler.h" -TandemCondorProcess::TandemCondorProcess(WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch) : TandemBatchProcess(p_monitor, tandem_run_batch) { +TandemCondorProcess::TandemCondorProcess(MainWindow * p_main_window, WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch) : TandemBatchProcess(p_main_window,p_monitor, tandem_run_batch) { /* Universe = vanilla notification = Error diff --git a/src/core/tandem_run/tandemcondorprocess.h b/src/core/tandem_run/tandemcondorprocess.h index 38176c5d0532acb98516000dd1bb58fbc9381357..0792e44dcb96d05221d323bed03d4b77422ad863 100644 --- a/src/core/tandem_run/tandemcondorprocess.h +++ b/src/core/tandem_run/tandemcondorprocess.h @@ -36,7 +36,7 @@ class TandemCondorProcess: public TandemBatchProcess { public: - TandemCondorProcess(WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch); + TandemCondorProcess(MainWindow * p_main_window, WorkMonitorInterface * p_monitor, const TandemRunBatch & tandem_run_batch); virtual ~TandemCondorProcess(); virtual void prepareXmlDatabaseFile(); diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index df2ad7d40c8cdb5632be187650db383cb61f0caf..4ca131035d1fb5dd092fed968101be1d15f25e41 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -108,6 +108,10 @@ MainWindow::~MainWindow() } +bool MainWindow::stopWorkerThread() { + return _p_waiting_message_dialog->stopWorkerThread(); +} + void MainWindow::closeEvent(QCloseEvent * event) { if (true) { event->accept(); diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index f55e70742f48c9f333f42bec184f00b02e17ed0d..345901cea5b518f89d05f3b1092aac46c1018321 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -55,6 +55,11 @@ public: explicit MainWindow(QWidget * parent = 0); ~MainWindow(); + + /** @brief tells if the worker should stop running his job + * @param bool true asks to stop + */ + bool stopWorkerThread(); public slots: void loadResults(); diff --git a/src/gui/waiting_message_dialog/waiting_message_dialog.ui b/src/gui/waiting_message_dialog/waiting_message_dialog.ui index 5553964b837440a15d515aea04da7b1d73dd5fbb..d0ac9f0831a5528629f8f1e6b37f402a31be32eb 100644 --- a/src/gui/waiting_message_dialog/waiting_message_dialog.ui +++ b/src/gui/waiting_message_dialog/waiting_message_dialog.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>746</width> - <height>86</height> + <height>150</height> </rect> </property> <property name="windowTitle"> @@ -46,14 +46,59 @@ <item> <widget class="QPlainTextEdit" name="console_plaintextedit"/> </item> + <item> + <layout class="QHBoxLayout" name="stop_horizontal_layout"> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="stop_push_button"> + <property name="text"> + <string>Stop</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </item> </layout> </widget> <resources/> - <connections/> + <connections> + <connection> + <sender>stop_push_button</sender> + <signal>toggled(bool)</signal> + <receiver>WaitingMessageDialog</receiver> + <slot>toggledStopButton(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>704</x> + <y>130</y> + </hint> + <hint type="destinationlabel"> + <x>806</x> + <y>197</y> + </hint> + </hints> + </connection> + </connections> <slots> <slot>chooseFiles()</slot> <slot>reject()</slot> <slot>accept()</slot> <slot>clearFileList()</slot> + <slot>toggledStopButton(bool)</slot> </slots> </ui> diff --git a/src/gui/waiting_message_dialog/waitingmessagedialog.cpp b/src/gui/waiting_message_dialog/waitingmessagedialog.cpp index aea9e475fc764c4e32e6aa449510be0ec6c8b274..89a3107271c5df406c05797210fbb2efcaa40cde 100644 --- a/src/gui/waiting_message_dialog/waitingmessagedialog.cpp +++ b/src/gui/waiting_message_dialog/waitingmessagedialog.cpp @@ -25,6 +25,7 @@ #include "waitingmessagedialog.h" #include <QDebug> #include <QLabel> +#include <QMutexLocker> WaitingMessageDialog::WaitingMessageDialog(QWidget * parent): QDialog(parent), @@ -44,10 +45,11 @@ WaitingMessageDialog::WaitingMessageDialog(QWidget * parent): } ui->movie_label->setMovie(_p_movie); ui->progress_bar->setVisible(false); - + ui->progress_bar->setMaximum(100); ui->progress_bar->setMinimum(0); ui->console_plaintextedit->setHidden(true); + ui->stop_push_button->setVisible(false); //movie->start(); qDebug() << "WaitingMessageDialog::WaitingMessageDialog end"; } @@ -59,8 +61,25 @@ WaitingMessageDialog::~WaitingMessageDialog() qDebug() << "WaitingMessageDialog::~WaitingMessageDialog end"; } +void WaitingMessageDialog::toggledStopButton(bool pushed) { + QMutexLocker mutex_locker(&_mutex); + _asked_to_stop = true; +} + +bool WaitingMessageDialog::stopWorkerThread() { + QMutexLocker mutex_locker(&_mutex); + if (!ui->stop_push_button->isVisible()) { + ui->stop_push_button->setChecked(false); + ui->stop_push_button->setVisible(true); + _asked_to_stop = false; + return false; + } + return _asked_to_stop; + +} + void WaitingMessageDialog::message(const QString & message) { - + ui->progress_bar->setVisible(false); ui->message_label->setText(message); } @@ -75,7 +94,7 @@ void WaitingMessageDialog::message(const QString & message, int progress_value) void WaitingMessageDialog::appendText(char * text) { ui->console_plaintextedit->setHidden(false); //ui->console_plaintextedit->appendText(text); - + ui->console_plaintextedit->moveCursor (QTextCursor::End); ui->console_plaintextedit->insertPlainText (text); } @@ -85,8 +104,8 @@ void WaitingMessageDialog::hideEvent( QHideEvent* event ) { qDebug() << "WaitingMessageDialog::hideEvent"; _p_movie->stop(); ui->console_plaintextedit->setHidden(true); -} +} void WaitingMessageDialog::showEvent( QShowEvent* event ) { QWidget::showEvent( event ); _p_movie->start(); -} +} diff --git a/src/gui/waiting_message_dialog/waitingmessagedialog.h b/src/gui/waiting_message_dialog/waitingmessagedialog.h index 64f66309f190ee1c35eb1ace90a39c67d92b4509..4713f06015d6860205e5b5c82387b7ffb1370f02 100644 --- a/src/gui/waiting_message_dialog/waitingmessagedialog.h +++ b/src/gui/waiting_message_dialog/waitingmessagedialog.h @@ -27,6 +27,7 @@ #include <QDialog> #include <QStringListModel> #include <QMovie> +#include <QMutex> #include "../project_view/automatic_filter_widget/automaticfilterwidget.h" @@ -48,10 +49,20 @@ public: void appendText(char * text); void showEvent( QShowEvent* event ); void hideEvent( QHideEvent* event ); + + bool stopWorkerThread(); + +private slots: + void toggledStopButton(bool pushed); private: Ui::WaitingMessageDialog *ui; QMovie * _p_movie; + + bool _asked_to_stop = false; + + + QMutex _mutex; }; diff --git a/src/gui/workerthread.cpp b/src/gui/workerthread.cpp index 4919ad087c3b091ddb1f4c30cf3d0c0bc24d6bac..f1a5e822996979ad31b82f6266984bc315830124 100644 --- a/src/gui/workerthread.cpp +++ b/src/gui/workerthread.cpp @@ -340,11 +340,11 @@ void WorkerThread::doRunningXtandem(TandemRunBatch tandem_run_batch) { QString default_location = settings.value("condor/tmp_dir", "").toString(); if (default_location.isEmpty()) { - TandemBatchProcess xt_process (_p_work_monitor, tandem_run_batch); + TandemBatchProcess xt_process (_p_main_window ,_p_work_monitor, tandem_run_batch); xt_process.run(); } else { - TandemCondorProcess xt_process (_p_work_monitor, tandem_run_batch); + TandemCondorProcess xt_process (_p_main_window ,_p_work_monitor, tandem_run_batch); xt_process.run(); }