我正在尝试让我的自动更新器适用于我的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父母孤立进程的方式?
答案 0 :(得分:1)
我可以部分回答我自己的问题。这很简单:行为只在调试时发生,而不是在正常运行时发生。
至于问题的另一部分,导致文件保持锁定的挂起过程:由于某种原因,它不再那样做了......即使我再次安装旧版本......