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.

This commit is contained in:
nemu
2011-02-21 10:20:47 +00:00
parent 7fc76c7cb1
commit 076753e018
5 changed files with 27 additions and 12 deletions

View File

@ -54,6 +54,7 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QVector<QString>
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<QString>
tr("Quit") );
done(0);
}
fProcPID = fProc->pid();
}
//----------------------------------------------------------------------------------------------------
@ -94,15 +96,19 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QVector<QString>
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;

View File

@ -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

View File

@ -48,6 +48,7 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QValueVector<QStr
fOutput = new QTextEdit( fVbox );
fOutput->setMinimumSize(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, QValueVector<QStr
tr("Quit") );
done(0);
}
fProcPID = fProc->processIdentifier();
}
//----------------------------------------------------------------------------------------------------
@ -83,7 +85,13 @@ PFitOutputHandler::PFitOutputHandler(QString workingDirectory, QValueVector<QStr
PFitOutputHandler::~PFitOutputHandler()
{
if (fProc->isRunning()) {
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();

View File

@ -58,6 +58,7 @@ class PFitOutputHandler : public QDialog
virtual void processDone();
private:
Q_LONG fProcPID;
QProcess *fProc;
QVBox *fVbox;