Во-первых, я никогда не сталкивался с необходимостью создавать что-либо кроме 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
}
}
Вам необходимо * Inter-process communication *, Qt имеет набор классов D-Bus, которые подходят для этого. – cmannett85