Russian Qt Forum
Ноябрь 15, 2024, 11:28
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
startDetached() - как отловить завершение процесса?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: startDetached() - как отловить завершение процесса? (Прочитано 7361 раз)
transto
Гость
startDetached() - как отловить завершение процесса?
«
:
Июнь 08, 2008, 19:45 »
Надо запустить приложение стороннее, дождаться его завершения, затем открыть диалог на выбор дальнейшего действия.
Все прекрасно работает со QProcess::start() и затем QProcess::waitForFinished(). НО не запускаются нормально некоторые приложения (тот же Far или cmd.exe).
В startDetached() все запускается, но как синхронизироваться? Даже если использовать winapi. По PID получаю несколько HWND, а дальше не получается WaitForMultipleObjects().
Что делать?
Записан
Sergeich
Гость
Re: startDetached() - как отловить завершение процесса?
«
Ответ #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
Гость
Re: startDetached() - как отловить завершение процесса?
«
Ответ #2 :
Июнь 09, 2008, 06:44 »
Цитата: transto от Июнь 08, 2008, 19:45
...НО не запускаются нормально некоторые приложения (тот же Far или cmd.exe)....
Что есть критерий нормальности запуска приложения? Консольные? Почему?
Записан
transto
Гость
Re: startDetached() - как отловить завершение процесса?
«
Ответ #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
Гость
Re: startDetached() - как отловить завершение процесса?
«
Ответ #4 :
Июнь 10, 2008, 08:04 »
Под linux нет Far-а. :-)
А если серьёзно, то QProcess облегчает стандартную коммуникацию между процессами через потоки ввода/вывода. Поэтому, когда процесс запускается через start или execute - настраивается перенаправление ввода/вывода к родительскому процессу и как следствие консоль не создаётся.
startDetached - единственный метод, который не создаёт перенаправления, соответственно винда создаёт консоль.
Т.к. ты не используешь стандартный метод коммуникации, то и QProcess тебе ни в чём, кроме запуска помочь не может. :-)
Т.е. твой метод вполне правильный.
P.S. Для nix-оидных это всё похоже, но там, терминал для отображения в X-ах не создаётся системой автоматом. Что там нужно проделывать для "нормального" запуска я не в курсе. :-)
Записан
Alex03
Гость
Re: startDetached() - как отловить завершение процесса?
«
Ответ #5 :
Июнь 10, 2008, 12:18 »
Цитата: Tonal от Июнь 10, 2008, 08:04
А если серьёзно, то QProcess облегчает стандартную коммуникацию между процессами через потоки ввода/вывода. Поэтому, когда процесс запускается через start или execute - настраивается перенаправление ввода/вывода к родительскому процессу и как следствие консоль не создаётся.
startDetached - единственный метод, который не создаёт перенаправления, соответственно винда создаёт консоль.
В коде startDetached() передаётся CREATE_NEW_CONSOLE в CreateProcessX().
Цитировать
P.S. Для nix-оидных это всё похоже, но там, терминал для отображения в X-ах не создаётся системой автоматом. Что там нужно проделывать для "нормального" запуска я не в курсе. :-)
Видимо там только принудительный запуск xterm - и ему подобных прог.
Записан
Tonal
Гость
Re: startDetached() - как отловить завершение процесса?
«
Ответ #6 :
Июнь 11, 2008, 08:06 »
В msdn "Creation of a Console" описано как и когда создаётся консоль. Там не написано в прямую, что при флаге CREATE_NEW_CONSOLE консоль создаётся только для консольных процессов, но зато написано, что при флаге DETACHED_PROCESS она не создаётся.
Так что флаг похоже вполне к месту. :-)
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...