2015-09-25 170 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。