如何在Qt中为QProcess调用:: TerminateProcess(windows)?

时间:2015-08-07 14:38:27

标签: qt ssh rsync

我真的需要在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

1 个答案:

答案 0 :(得分:0)

如果您正在启动非分离流程,那么QProcess会为您提供所需的所有工具。您可以根据需要使用QProcess::killQProcess::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