在Qt中杀死QProcess

时间:2015-04-07 12:11:40

标签: qt qprocess

我想知道如何在Qt,Linux中杀死QProcess。我启动一个外部应用程序说像一个显示图像的应用程序(全屏),没有标题栏,所以没有关闭按钮。现在我需要在5秒后关闭此应用程序。我怎么在Qt中做到这一点?

void MainWindow::Dialog()
{
  ......
  ......
  connect(pbLaunchImage,SIGNAL(released()),this, SLOT(launchImage()));
  //I am guessing a connect here to kill the started process
}

void MainWindow::launchImage()
{
    qWarning("Launching Image...");
    p->execute("/usr/bin/fancyImage");
}

修改

  

我仍然没有想到它,但我发现了一个解决方法,因为我有外部应用程序的来源。我添加了一个Exit操作,关闭打开的外部应用程序。但如果有人对QProcess有任何想法,请将其作为答案发布。

1 个答案:

答案 0 :(得分:0)

首先,你不能使用QProcess::execute(...),因为它是一种阻止方便的方法。您的Qt程序会有效停止(错误如果它是一个GUI程序,它会停止超过眨眼)。您需要使用QProcess::start(...)启动该过程,并让您的Qt程序继续运行。


如果子进程表现良好,只需致电QProcess::terminte() slot method即可退出。子进程发送TERM TERM信号(在Linux / Unix上),然后它应该干净地退出。

如果进程表现不佳,并且拒绝退出TERM,则必须使用QProcess::kill() slot method,但如果可能的话,我宁愿修复子应用程序。

然后,要在5秒后退出,请使用QTimer。在你创建p的地方就是这样的,假设它是 QProcess 而不是其他东西:

// p = new QProcess... or something equivalent happened here
// below code needs to be done once per creation of `p`

// create a timer with p as parent, so it will be deleted properly
QTimer *killtimer = new QTimer(p); 
killtimer->setTimeout(5000); // 5 seconds
killtimer->setSingleShot(true); // should happen only once per process start

// make the timer's timeout to terminate the process
QObject::connect(killtimer, SIGNAL(timeout()), p, SLOT(terminate()));

// make the timer start when process starts
QObject::connect(p, SIGNAL(started()), killtimer, SLOT(start()));

// you also want to connect signals to slots, and at least do debug print
// example:
QObject::connect(p, SIGNAL(started()), this, SLOT(handleStarted()));
QObject::connect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(handleFinished(int,QProcess::ExitStatus)));
QObject::connect(p, SIGNAL(error(QProcess::ProcessError)), this, SLOT(handleError(QProcess::ProcessError)));

// then just launch the process. this program will also keep running
p->start("/usr/bin/fancyImage");