Russian Qt Forum

Qt => Общие вопросы => Тема начата: transto от Июнь 08, 2008, 19:45



Название: startDetached() - как отловить завершение процесса?
Отправлено: transto от Июнь 08, 2008, 19:45
Надо запустить приложение стороннее, дождаться его завершения, затем открыть диалог на выбор дальнейшего действия.

Все прекрасно работает со QProcess::start() и затем QProcess::waitForFinished(). НО не запускаются нормально некоторые приложения (тот же Far или cmd.exe).
В startDetached() все запускается, но как синхронизироваться? Даже если использовать winapi. По PID получаю несколько HWND, а дальше не получается WaitForMultipleObjects().
Что делать? :(


Название: Re: startDetached() - как отловить завершение процесса?
Отправлено: Sergeich от Июнь 08, 2008, 20:13
Цитировать
int QProcess::execute ( const QString & program, const QStringList & arguments )   [static]
Starts the program program with the arguments arguments in a new process, waits for it to finish, and then returns the exit code of the process. Any data the new process writes to the console is forwarded to the calling process.
Оно?


Название: Re: startDetached() - как отловить завершение процесса?
Отправлено: Alex03 от Июнь 09, 2008, 06:44
...НО не запускаются нормально некоторые приложения (тот же Far или cmd.exe)....
Что есть критерий нормальности запуска приложения? Консольные? Почему?


Название: Re: startDetached() - как отловить завершение процесса?
Отправлено: transto от Июнь 09, 2008, 15:47
QProcess::execute(...) тоже не запускает нормально консольные приложения.
Нормально - это значит, что основное окно этих приложений невидимое.
Попробуйте запустить cmd.exe или far.exe с помощью QProcess::execute(QString("cmd.exe"));
Я бы даже сказал - нет видимых окон у таких приложений, при запуске в обертке QProcess, а от startDetached() средствами QT ниче не добиться.

За сим, возлагаю миссию на api целевой платформы, в данном случае, виндовса. И юзаю startDetached() -> pid -> OpenProcess -> HANDLE -> WaitForSingleObject.
А как это будет выглядеть на linux и mac?


Название: Re: startDetached() - как отловить завершение процесса?
Отправлено: Tonal от Июнь 10, 2008, 08:04
Под linux нет Far-а. :-)
А если серьёзно, то QProcess облегчает стандартную коммуникацию между процессами через потоки ввода/вывода. Поэтому, когда процесс запускается через start или execute - настраивается перенаправление ввода/вывода к родительскому процессу и как следствие консоль не создаётся.
startDetached - единственный метод, который не создаёт перенаправления, соответственно  винда создаёт консоль.
Т.к. ты не используешь стандартный метод коммуникации, то и QProcess тебе ни в чём, кроме запуска помочь не может. :-)
Т.е. твой метод вполне правильный.

P.S. Для nix-оидных это всё похоже, но там, терминал для отображения в X-ах не создаётся системой автоматом. Что там нужно проделывать для "нормального" запуска я не в курсе. :-)


Название: Re: startDetached() - как отловить завершение процесса?
Отправлено: Alex03 от Июнь 10, 2008, 12:18
А если серьёзно, то QProcess облегчает стандартную коммуникацию между процессами через потоки ввода/вывода. Поэтому, когда процесс запускается через start или execute - настраивается перенаправление ввода/вывода к родительскому процессу и как следствие консоль не создаётся.
startDetached - единственный метод, который не создаёт перенаправления, соответственно  винда создаёт консоль.
В коде startDetached() передаётся CREATE_NEW_CONSOLE в CreateProcessX().
Цитировать
P.S. Для nix-оидных это всё похоже, но там, терминал для отображения в X-ах не создаётся системой автоматом. Что там нужно проделывать для "нормального" запуска я не в курсе. :-)
Видимо там только принудительный запуск xterm - и ему подобных прог.



Название: Re: startDetached() - как отловить завершение процесса?
Отправлено: Tonal от Июнь 11, 2008, 08:06
В msdn "Creation of a Console" описано как и когда создаётся консоль. Там не написано в прямую, что при флаге CREATE_NEW_CONSOLE консоль создаётся только для консольных процессов, но зато написано, что при флаге DETACHED_PROCESS она не создаётся.
Так что флаг похоже вполне к месту. :-)