Во-первых, я никогда не сталкивался с необходимостью создавать что-либо кроме QThread
для удовлетворения моих потребностей в обновлении.QProcess
будет полезно, если после обновления пользователь захочет загрузить, установить и перезапустить программу, пока пользователь продолжит работу с основной программой.(Но все это может быть достигнуто с помощью сценария оболочки, сценария Python, даже файла BAT)
Когда вы используете QProcess
, вам придется полагаться на сигналы readyReadStandardError()
и readyReadStandardOutput()
.Затем приложение, вызываемое вашим процессом, должно отправить свои выходные данные stderr или stdout . Updater.exe должен записать в любой из этих файлов.
Я бы предположил, что ваш Updater использует 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 будет полноценным приложением с графическим интерфейсом, невызовите метод 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
}
}