【问题标题】:How to call ::TerminateProcess (windows) for a QProcess in Qt?如何在 Qt 中为 QProcess 调用 ::TerminateProcess (windows)?
【发布时间】: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

}

【问题讨论】:

  • 我试过了,但killterminate 都不起作用。我已经编辑了帖子以包含我要终止进程的功能。
  • 另外,我的回答中有一个工作示例。从那开始。检查它是否适合您。然后你就可以在此基础上再接再厉。
  • 对不起,您必须更明确地说明哪些进程没有被杀死。如果我将应用程序本身作为子进程启动,它在我给出的示例中有效。
  • @KubaOber rsync 和 'ssh` 不会被 QProcess 启动。就我而言,它正在复制大量文件,因此需要一段时间。在您的情况下,rsync 可能只是在等待密码或其他东西,如果您提供真实值以便它从某个地方(非本地位置)复制文件,那么它不会被杀死。
  • 提供指向您作为rsyncssh 使用的确切二进制文件的链接。

标签: qt ssh rsync


【解决方案1】:

如果您要启动非分离进程,那么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 方法可以输出一个pid,您可以将其与本机 api 一起使用。

【讨论】:

  • 我用代码更新了我的帖子,它实际上和你写的一样,除了我在课堂上但它不起作用。
猜你喜欢
  • 2013-04-19
  • 2011-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
相关资源
最近更新 更多