Russian Qt Forum
Июля 04, 2025, 19:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: startDetached() - как отловить завершение процесса?  (Прочитано 7572 раз)
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.023 секунд. Запросов: 17.