Russian Qt Forum

Qt => Общие вопросы => Тема начата: Godfather от Июнь 02, 2008, 20:01



Название: Перезапуск приложения
Отправлено: Godfather от Июнь 02, 2008, 20:01
Такой вопрос - как из под приложения перезапустить самого себя?

Пробовал QProcess::start() но я так понял что это запуск дочернего процеса, и если основной убить, умирает и этот

Ситуация следующая:
Код:
QMessageBox::StandardButton ret = QMessageBox::question(this, strMsgTitle, QString::fromLocal8Bit("Что бы изменения вступили в силу, необходимо перезапустить приложение. Сделать это сейчас?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
switch(ret)
{
case QMessageBox::Yes:
{
QProcess* proc = new QProcess();
proc->start(QApplication::applicationDirPath() + "/app.exe");
QApplication::quit();
break;
}
case QMessageBox::No:
{
reject();
break;
}
case QMessageBox::Cancel:
{
return;
break;
}
}


Название: Re: Перезапуск приложения
Отправлено: Sergeich от Июнь 02, 2008, 21:41
Код:
if ( QProcess::startDetached(QString("\"") + QApplication::applicationFilePath() + "\"") )
  QApplication::quit();
else
  qDebug("WTF!!! Can't restart process!");


Название: Re: Перезапуск приложения
Отправлено: Alex03 от Июнь 03, 2008, 06:21
У меня прога пользовала некоторые общие ресурсы в монопольном режиме (да ещё была проверка на запуск второго экземпляра), поэтому делал таким кривоватым способом:
1. Выделил код возврата из приложения для перезапуска
2. запускал прогу из скрипта (bash / cmd-в винде) в котором в цикле запускал прогу пока код возврата - ПЕРЕЗАПУСК.

Правда в цикле скрипта у меня ещё кое что было, что ещё более оправдывало такой подход.... :)


Название: Re: Перезапуск приложения
Отправлено: Godfather от Июнь 03, 2008, 12:37
спасибо большое! то что надо!
Код:
QProcess::startDetached(QApplication::applicationFilePath(), QStringList(), QApplication::applicationDirPath());


Название: Re: Перезапуск приложения
Отправлено: Sergeich от Июнь 03, 2008, 16:53
Код:
QProcess::startDetached(QApplication::applicationFilePath(), QStringList(), QApplication::applicationDirPath());
Если в пути к файлу присутствует пробел (например C:/Documents and Settings/User/Мои документы), то путь нужно заключать в кавычки, иначе под виндой QProcess не запустится.
Цитировать
On Windows, arguments that contain spaces are wrapped in quotes.


Название: Re: Перезапуск приложения
Отправлено: Godfather от Июнь 03, 2008, 19:51
точняк, забыл совсем


Название: Re: Перезапуск приложения
Отправлено: Alex03 от Июнь 04, 2008, 06:25
А я в X11 во времена 3-ей Qt наступал на грабли с QApplication::applicationFilePath()/QApplication::applicationDirPath().
Там прямо у ОС узнать нельзя, поэтому Qt действовала несколько эвристически, на основе arg[0], переменной окружения PATH и текущего пути.
Так вот грабли заключались в том что bash (и видимо другие шеллы) по разному относительно qt воспринимали "пустой путь" в PATH.
Т.е. когда
PATH=:dir1:dir2
PATH=dir1::dir2
PATH=dir1:dir2:

Постил об этом тролям но чтото тогда ответа не было.... 4-5лет назад дело было... Сейчас не знаю как обстоит дело... :)