以QProcess :: startDetached开始的进程仍然是子进程,并在父进程退出时被终止

时间:2014-03-05 16:30:32

标签: windows qt

我正在尝试让我的自动更新器适用于我的Qt 5.1项目(在Windows 7 32位上运行)。它下载安装程序,启动它并退出。问题是,当应用程序退出时,安装程​​序将随之一起被终止,无论进程是否已分离启动。

这是有问题的代码。

QScopedPointer<QTemporaryFile> installerFile(new QTemporaryFile());
installerFile->setFileTemplate(QDir::tempPath() + "/Setup_XXXXXX.exe");
installerFile->setAutoRemove(false);

if (installerFile->open())
{
    installerFile->write(setupDownloadReply->readAll());
    installerFile->close();
    QString filename = installerFile->fileName();
    installerFile.reset(); // Delete the object Otherwise Windows doesn't release it.

    // Neither of these two options actually start a non-child process
    bool started = QDesktopServices::openUrl(QUrl::fromLocalFile(filename));
    //bool started = QProcess::startDetached(filename);

    if (started)
    {
        if (!toVersion.isEmpty())
            settings.setValue(SETTINGS_UPDATING_TO, toVersion);

        QApplication::quit();
    }
}

Sysinternals进程资源管理器显示启动的安装程序实际上是启动它的程序的子代,即使我执行openUrl。我觉得这很奇怪。

如果我使用mainwindow->close()代替QApplication::quit(),则窗口会消失,但进程会一直挂起。然后,安装程序无法覆盖锁定的文件。

那么,我该如何真正开始一个独立的过程呢?是否有类似于Linux父母孤立进程的方式?

1 个答案:

答案 0 :(得分:1)

我可以部分回答我自己的问题。这很简单:行为只在调试时发生,而不是在正常运行时发生。

至于问题的另一部分,导致文件保持锁定的挂起过程:由于某种原因,它不再那样做了......即使我再次安装旧版本......