From 076753e0180b1f75d4cca99bb99d27401d268de9 Mon Sep 17 00:00:00 2001 From: nemu Date: Mon, 21 Feb 2011 10:20:47 +0000 Subject: [PATCH] added an additional layer for process killing to musrgui/musredit which hopefully should help to reduce the number of musrfit/musrview corpses with high CPU load. --- ChangeLog | 2 ++ src/musredit/PFitOutputHandler.cpp | 20 +++++++++++++------- src/musredit/PFitOutputHandler.h | 1 + src/musrgui/PFitOutputHandler.cpp | 15 ++++++++++----- src/musrgui/PFitOutputHandler.h | 1 + 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6920d2ff..d9c22e9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -28,6 +28,8 @@ FIXED 2 little annoying problems: (i) now it is possible to zoom down to the sin (ii) when switching between data- and difference-view, the x-range doesn't change anymore. FIXED musrt0 crash for histogram number out of range (MUSR-157) FIXED fixes the inadequate attempt to use log max likelihood fit for asymmetry/non-muSR fit (MUSR-148) +CHANGED added an additional layer for process killing to musrgui/musredit which hopefully should help to reduce the number of + musrfit/musrview corpses with high CPU load. CHANGED the formating of the parameters such that they show the precision corresponding to the error. At the same time some other parameter formating is improved (MUSR-167) CHANGED the default behavior of msr2data for writing output-file headers (see svn-log 4758) diff --git a/src/musredit/PFitOutputHandler.cpp b/src/musredit/PFitOutputHandler.cpp index a12d7a09..e6de95a8 100644 --- a/src/musredit/PFitOutputHandler.cpp +++ b/src/musredit/PFitOutputHandler.cpp @@ -54,6 +54,7 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QVector fVbox->addWidget(fOutput); fOutput->setMinimumSize(800, 455); fOutput->setReadOnly(true); + connect( fOutput, SIGNAL( destroyed() ), this, SLOT( quitButtonPressed() ) ); fQuitButton = new QPushButton( tr("Fitting...") ); fVbox->addWidget(fQuitButton); connect( fQuitButton, SIGNAL( clicked() ), this, SLOT( quitButtonPressed() ) ); @@ -85,6 +86,7 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QVector tr("Quit") ); done(0); } + fProcPID = fProc->pid(); } //---------------------------------------------------------------------------------------------------- @@ -94,15 +96,19 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QVector PFitOutputHandler::~PFitOutputHandler() { if (fProc->state() == QProcess::Running) { - qDebug() << "fProc still running" << endl; - fProc->kill(); + fProc->terminate(); + if (!fProc->waitForFinished()) { + qDebug() << "fProc still running, will call kill." << endl; + fProc->kill(); + } + fProc->waitForFinished(); } -/* - if (fProc->isRunning()) { - QString msg = "fProc still running ..."; - qDebug(msg); + if (fProc->state() == QProcess::Running) { + QString cmd = "kill -9 "+ fProcPID; + QString msg = "fProc still running even after Qt kill, will try system kill cmd: "+cmd; + qDebug() << msg << endl; + system(cmd.toLatin1()); } -*/ if (fProc) { delete fProc; fProc = 0; diff --git a/src/musredit/PFitOutputHandler.h b/src/musredit/PFitOutputHandler.h index 826be752..e1c694ae 100644 --- a/src/musredit/PFitOutputHandler.h +++ b/src/musredit/PFitOutputHandler.h @@ -64,6 +64,7 @@ class PFitOutputHandler : public QDialog virtual void processDone(int exitCode, QProcess::ExitStatus exitStatus); private: + Q_PID fProcPID; ///< keeps the process PID QProcess *fProc; ///< pointer to the musrfit process QVBoxLayout *fVbox; ///< pointer to the dialog layout manager diff --git a/src/musrgui/PFitOutputHandler.cpp b/src/musrgui/PFitOutputHandler.cpp index 2711abec..41fbf27d 100644 --- a/src/musrgui/PFitOutputHandler.cpp +++ b/src/musrgui/PFitOutputHandler.cpp @@ -48,6 +48,7 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QValueVectorsetMinimumSize(800, 455); fOutput->setReadOnly(true); + connect( fOutput, SIGNAL( destroyed() ), this, SLOT(quitButtonPressed() ) ); fQuitButton = new QPushButton( tr("Fitting..."), fVbox ); connect( fQuitButton, SIGNAL( clicked() ), this, SLOT( quitButtonPressed() ) ); resize( 800, 500 ); @@ -74,6 +75,7 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QValueVectorprocessIdentifier(); } //---------------------------------------------------------------------------------------------------- @@ -83,7 +85,13 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QValueVectorisRunning()) { - fProc->kill(); + fProc->tryTerminate(); + QTimer::singleShot( 3000, fProc, SLOT( kill() ) ); + } + if (fProc->isRunning()) { // try low level kill + char cmd[128]; + sprintf(cmd, "kill -9 %ld", fProcPID); + system(cmd); } if (fProc) { delete fProc; @@ -130,11 +138,8 @@ void PFitOutputHandler::quitButtonPressed() { // if the fitting is still taking place, kill it if (fProc->isRunning()) { -/* fProc->tryTerminate(); - QTimer::singleShot( 100, fProc, SLOT( kill() ) ); -*/ - fProc->kill(); + QTimer::singleShot( 1000, fProc, SLOT( kill() ) ); } accept(); diff --git a/src/musrgui/PFitOutputHandler.h b/src/musrgui/PFitOutputHandler.h index 58837799..8f139998 100644 --- a/src/musrgui/PFitOutputHandler.h +++ b/src/musrgui/PFitOutputHandler.h @@ -58,6 +58,7 @@ class PFitOutputHandler : public QDialog virtual void processDone(); private: + Q_LONG fProcPID; QProcess *fProc; QVBox *fVbox;