使用QProcess
实现更新程序,我从应用程序启动一个分离进程并立即退出。在生成的更新过程中,我会根据需要覆盖文件,然后再次启动主应用程序。问题是,如果主应用程序在更新程序开始覆盖它们之前没有"足够快"地关闭以释放所有加载的库,则文件的更新有时会失败。一种方法是等待任意数量的时间,比如1秒,然后开始更新,但我宁愿实现一些实际检查父进程是否不再运行的东西。我可以传递它的ID,当我刷它,但这并没有真正削减它,因为似乎没有功能,如bool QProcess::isRunning(qint64 pid)
。我也不认为跨应用程序连接信号和插槽是可能的……什么好主意吗?
您可以在两个应用程序中使用QSystemSemaphore
类来等待。
应用程序:
int main()
{
QSystemSemaphore sem( "some_uuid", 1, QSystemSemaphore::Create );
sem.acquire();
// ...
app.exec();
// TODO: start updater
// sem.release(); // not sure, that it will not be done automatically
return 0;
}
更新:
int main()
{
QSystemSemaphore sem( "some_uuid", 1, QSystemSemaphore::Open );
sem.acquire(); // Will wait for application termination
// ...
app.exec();
return 0;
}
你不应该忘记错误处理。你应该试着从"update .exe"中打开和关闭文件"yourapp.exe",以确保该应用程序已关闭。
对于100%的结果,最好使用特定于平台的API