2015-09-25 158 views
3

使用QProcess来实现更新程序我从我的应用程序启动一个分离的进程并立即退出。在衍生更新程序中,我将根据需要覆盖文件,然后再次启动主应用程序。问题是,如果主应用程序在更新程序开始覆盖它们之前没有“足够快地”关闭以释放所有已加载的库,则文件的更新有时可能会失败。一种方法是等待1秒等任意时间,然后开始更新,但我宁愿实施一些实际检查父进程是否不再运行的东西。当我产卵时,我可以传递它的ID,但是这并没有真正减少它,因为似乎没有功能,如bool QProcess::isRunning(qint64 pid)。我也不认为有可能连接信号和插槽跨应用程序...任何想法?如何启动分离进程并等待父进程终止?

+0

使用第三方解决方案可以在应用程序之间连接信号和插槽。来自Qt开发人员日(2014年柏林)的示例:https://www.youtube.com/watch?v=Lhv-rQ5etzo –

回答

4

您可以在两个应用程序中使用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; 
} 

你不应该忘记的错误处理。你应该尝试从“updater.exe”打开和关闭文件“yourapp.exe”,并确保该应用程序已关闭。

对于100%的结果,它可以使用特定于平台的API。