2011-12-17 21 views
2

嗯,我一直在尋找如何做一個谷歌自動更新,但沒有成功。自動更新程序示例

我會計劃是建立一個更新(另一個exe文件被稱爲QProcess中,雖然主要的exe文件),但這裏IHAVE一些問題:

我如何讓QProcess中沉默? 如果有一個新版本,我如何顯示從該進程開始的窗口通知(我的意思是我已經在Game.exe中創建了該進程,我想從Updater發送一個通知到Game.exe。 exe有新版本可用。)

感謝您的答案。

+1

您需要*進程間通信*,Qt有一個D-Bus類的集合,對此很有幫助。 – cmannett85 2011-12-17 10:25:14

回答

0

首先,我從來沒有遇到需要創建除QThread之外的其他任何東西來處理我的更新需求。如果一旦用戶更新,您想要在用戶繼續執行主程序時下載,安裝並重新啓動程序,則QProcess會很有幫助。

當您使用QProcess,你將不得不依賴於信號readyReadStandardError()readyReadStandardOutput()(不過這都可以用一個shell腳本,Python腳本,甚至BAT文件來實現)。然後,您的進程正在調用的應用程序應將其輸出發送至stderrstdoutUpdater.exe應寫入這些文件中的任何一個。

我想象你的更新器使用QNetworkAccessManager::finished(QNetworkReply *reply)。當這個槽被調用,請做一下更好比這

void Updater::replyFinished(QNetworkReply *reply){ 
    QString r(reply->readAll()); 
    if(r.contains(SERVER_REPLY_UPDATE_AVAILABLE)){ 
     qDebug() << "yes"; 
    }else{ 
     qDebug() << "no"; 
     QApplication::quit(); 
    } 
} 

如果Updater.exe將是一個完全成熟的GUI應用程序,不叫show()方法,除非它的需要,它應該似乎在後臺運行。我更喜歡劇本,但你認識我。

然後你的Game.exe將設置QProcess。您可以將參數傳遞給QProcess::start()函數中的過程。

很好的理由,這將有助於引導你的更新過程將是:

  • 的Game.exe版本號
  • 「check_for_updates」
  • 「ignore_updates」
  • 「download_update」

終於,在Game.exe

... 
connect(process,SIGNAL(readyReadStandardError()),this,SLOT(readProcessReply())); 
... 

void Game::readProcessReply(){ 
    QString r(process->readAllStandardError()); 
    if(r.contains("yes")){ 
     //show your dialog here 
    }else{ 
     //do nothing 
    } 
}