Russian Qt Forum
Ноябрь 15, 2024, 09:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: startDetached() - как отловить завершение процесса?  (Прочитано 7359 раз)
transto
Гость
« : Июнь 08, 2008, 19:45 »

Надо запустить приложение стороннее, дождаться его завершения, затем открыть диалог на выбор дальнейшего действия.

Все прекрасно работает со QProcess::start() и затем QProcess::waitForFinished(). НО не запускаются нормально некоторые приложения (тот же Far или cmd.exe).
В startDetached() все запускается, но как синхронизироваться? Даже если использовать winapi. По PID получаю несколько HWND, а дальше не получается WaitForMultipleObjects().
Что делать? Грустный
Записан
Sergeich
Гость
« Ответ #1 : Июнь 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.
Оно?
Записан
Alex03
Гость
« Ответ #2 : Июнь 09, 2008, 06:44 »

...НО не запускаются нормально некоторые приложения (тот же Far или cmd.exe)....
Что есть критерий нормальности запуска приложения? Консольные? Почему?
Записан
transto
Гость
« Ответ #3 : Июнь 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?
« Последнее редактирование: Июнь 09, 2008, 16:51 от transto » Записан
Tonal
Гость
« Ответ #4 : Июнь 10, 2008, 08:04 »

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

P.S. Для nix-оидных это всё похоже, но там, терминал для отображения в X-ах не создаётся системой автоматом. Что там нужно проделывать для "нормального" запуска я не в курсе. :-)
Записан
Alex03
Гость
« Ответ #5 : Июнь 10, 2008, 12:18 »

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

Записан
Tonal
Гость
« Ответ #6 : Июнь 11, 2008, 08:06 »

В msdn "Creation of a Console" описано как и когда создаётся консоль. Там не написано в прямую, что при флаге CREATE_NEW_CONSOLE консоль создаётся только для консольных процессов, но зато написано, что при флаге DETACHED_PROCESS она не создаётся.
Так что флаг похоже вполне к месту. :-)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.