【发布时间】:2015-08-07 14:38:27
【问题描述】:
我真的需要在 windows 上杀死一个 QProcess 及其所有子进程,我了解 windows 的 API ::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 又以ssh 开始。如果用户取消,我想杀死他们两个。即使我为 ssh 和 rsync 调用了taskkillabove,它们也不会被终止并继续同步。
所以我的问题是如何获得 QProcess 的句柄,以及最终如何杀死/终止 rsync 和 ssh 进程?
我只希望我的解决方案在 Windows 7 上运行,其他平台不重要。
▼更新▼
这是我要取消的代码。我有QProgressDialog当用户单击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
}
【问题讨论】:
-
我试过了,但
kill和terminate都不起作用。我已经编辑了帖子以包含我要终止进程的功能。 -
另外,我的回答中有一个工作示例。从那开始。检查它是否适合您。然后你就可以在此基础上再接再厉。
-
对不起,您必须更明确地说明哪些进程没有被杀死。如果我将应用程序本身作为子进程启动,它在我给出的示例中有效。
-
@KubaOber
rsync和 'ssh` 不会被QProcess启动。就我而言,它正在复制大量文件,因此需要一段时间。在您的情况下,rsync 可能只是在等待密码或其他东西,如果您提供真实值以便它从某个地方(非本地位置)复制文件,那么它不会被杀死。 -
提供指向您作为
rsync和ssh使用的确切二进制文件的链接。