我真的需要在Windows上杀死一个QProcess及其所有孩子,我理解Windows的::TerminateProcess
是我最好的朋友。我尝试过taskkill,但它仍然没有杀死这个过程。
QProcess::execute("taskkill /f /t ssh.exe");
QProcess::execute("taskkill /f /t rsync.exe"); // no luck
所以::TerminateProcess
是杀死处理的最粗野的方法,但是如何处理我开始的QProcess以便我可以使用它?
这是我的代码。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
syncProcess = new QProcess(this);
connect( syncProcess, SIGNAL( finished(int)), this, SLOT( syncFinished(int)) );
}
void MainWindow::sync()
{
QString rsync_cmd = QString("rsync/rsync -a root@%1:/root '%2'").arg( ip ).arg( destPath );
syncProcess->start( rsync_cmd );
_syncInProgress = true;
}
这将从rsync
开始,然后ssh
开始taskkill
。如果用户取消,我想杀死它们。即使我在ssh和rsync上面都调用QProgressDialog
,它们也不会被终止并继续同步。
所以我的问题是如何处理QProcess以及最终如何杀死/终止rsync和ssh进程?
我只希望我的解决方案适用于Windows 7,其他平台并不重要。
▼的更新▼
这是我取消的代码。当用户点击cancel
按钮时,我有void MainWindow::syncProgressCancelled()
{
disconnect( syncProgress.data(), SIGNAL( canceled()), this, SLOT(syncProgressCancelled()) );
_syncInProgress = false;
syncProgress->close(); // this just closed toe progress dialog
// make sure to kill the underlying ssh or rsync if running
// QProcess::execute("taskkill /f /t ssh.exe");
// QProcess::execute("taskkill /f /t rsync.exe");
syncProcess->terminate(); // kill doesn't work either
}
,我尝试杀死进程时会调用以下函数,但它仍能存活。
index
答案 0 :(得分:0)
如果您正在启动非分离流程,那么QProcess
会为您提供所需的所有工具。您可以根据需要使用QProcess::kill
或QProcess::terminate
。不需要winapi。
int main(int argc, char ** argv) {
QApplication app(argc, argv);
QPushButton kill("Kill");
kill.show();
QProcess process;
process.start("rsync ...");
QObject::connect(&kill, &QPushButton::clicked, &process, &QProcess::kill);
QObject::connect(&process, &QProcess::finished, &app, &QCoreApplication::quit);
return app.exec();
}
如果您要开始一个分离的过程,那么startDetached
方法可以输出您可以与原生api一起使用的pid
。