自动更新程序示例

时间:2011-12-17 09:18:56

标签: qt auto-update qprocess

好吧,我一直在寻找如何在谷歌上做一个自动更新程序,但没有成功。

我打算创建一个更新程序(由QProcess调用的另一个exe,虽然是主程exe)但是这里有一些问题:

如何让QProcess保持沉默? 如果有新版本,我如何在窗口上显示进程启动的通知(我的意思是我在Game.exe中创建进程,我想从Updater.exe向Game.exe发送通知这是一个新版本。)

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

首先,我从未遇到过需要创建QThread以外的任何内容来处理我的更新需求。如果用户更新后,您希望在用户继续使用主程序时下载,安装和重新启动程序,QProcess会很有用。 (但这可以通过shell脚本,python脚本,甚至是BAT文件来实现)

使用QProcess时,您必须依赖信号​​readyReadStandardError()readyReadStandardOutput()。然后,您的进程正在调用的应用程序应将其输出发送到 stderr stdout Updater.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
    }
}