Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Igors от Август 08, 2018, 17:41



Название: Запуск с ожиданием
Отправлено: Igors от Август 08, 2018, 17:41
Добрый день

Наверное чего-то не дочитал в букваре, плиз "ткните носиком". Нужно запустить процесс и выждать (чтобы потом его найти в списке процессов). Ну вроде QProcess::start и QProcess::waitForStarted. Но тогда деструктор QProcess прибьет(?) этот процесс, а мне это совсем  не нужно. А если QProcess::startDetached - то нет waitForStarted. И приходится нырять в нативняк - не хотелось бы

Спасибо


Название: Re: Запуск с ожиданием
Отправлено: qate от Август 08, 2018, 21:40
http://doc.qt.io/qt-5/qprocess.html#started - оно ?


Название: Re: Запуск с ожиданием
Отправлено: Igors от Август 09, 2018, 07:41
http://doc.qt.io/qt-5/qprocess.html#started - оно ?
Нет. Мне не нужно завершать
Цитировать
QProcess::~QProcess()

Destructs the QProcess object, i.e., killing the process.

Note that this function will not return until the process is terminated.


Название: Re: Запуск с ожиданием
Отправлено: qate от Август 09, 2018, 09:14
Нет. Мне не нужно завершать

так не завершай: new QProcess(this)



Название: Re: Запуск с ожиданием
Отправлено: Пантер от Август 09, 2018, 09:32
Нет. Мне не нужно завершать

так не завершай: new QProcess(this)



Создавай в куче и подписывайся на нужные сигналы. А когда надо будет, удаляй.


Название: Re: Запуск с ожиданием
Отправлено: Igors от Август 09, 2018, 11:58
Сигналы (асинхронка) здесь ни при чем, наоборот, нужна синхронка (waitForStarted). Есть небольшое приложение которое из сокета получает команды, напр

1) Запустить главный модуль
2) Передать ему данные задания (через шаред память)
3) Опрашивать модуль до тех пор пока задание не будет выполнено
и.т.д.

Сейчас главный модуль запускается, но пункт 2 не срабатывает (ОС не успевает запустить, в списке процессов модуля еще нет)

так не завершай: new QProcess(this)
Ну так сорить классами в куче по меньшей мере неаккуратно (пусть этих запусков и относительно немного - десятки, макс сотня)


Название: Re: Запуск с ожиданием
Отправлено: Авварон от Август 09, 2018, 14:32
Ну так не сорите, сохраните в синглтоне.
Бросать QProcess на пол в вашей хадаче плохо - ну а как процесс умрет и его PID кто-то переиспользует? Ваши действия?


Название: Re: Запуск с ожиданием
Отправлено: qate от Август 09, 2018, 18:06
Ну так сорить классами в куче по меньшей мере неаккуратно (пусть этих запусков и относительно немного - десятки, макс сотня)

сто раз вызвать new\delete - это ужас-ужас и неаккуратно ?


Название: Re: Запуск с ожиданием
Отправлено: Igors от Август 10, 2018, 06:40
сто раз вызвать new\delete - это ужас-ужас и неаккуратно ?
Не могу я вызывать delete  (ни явно ни неявно) т.к. это может прибить процесс (см букварь)

Ну хорошо, зайдем с др стороны. Запустили процесс QProcess::startDetached, все Ок, но это [static] - как теперь дождаться его реального запуска (напр в течение 5 сек) чтобы след команда уже смогла передать ему данные ? Исходники QProcess::waitForStarted открывал, ну там обильные "трубы", выдрать не удастся, проще самому через нативняк.


Название: Re: Запуск с ожиданием
Отправлено: Пантер от Август 10, 2018, 09:22
> Не могу я вызывать delete  (ни явно ни неявно) т.к. это может прибить процесс (см букварь)
Делай коннект на finished у процесса и там удаляй. В чем проблема? Тема элементарная, тебе уже сказали как делать, а ты даже попробовать не хочешь.


Название: Re: Запуск с ожиданием
Отправлено: Igors от Август 10, 2018, 10:40
> Не могу я вызывать delete  (ни явно ни неявно) т.к. это может прибить процесс (см букварь)
Делай коннект на finished у процесса и там удаляй. В чем проблема? Тема элементарная, тебе уже сказали как делать, а ты даже попробовать не хочешь.
Пример
Код
C++ (Qt)
QProcess * proc = new QProcess(name);
proc->waitForStarted(5000);
Все хорошо. Теперь данное приложение просто закрывается. Завершать созданный процесс нельзя - он нужен другим. Оставить "как есть"  (ничего не делать) вряд ли корректно. Мои действия?


Название: Re: Запуск с ожиданием
Отправлено: Пантер от Август 10, 2018, 11:17
Тут зависит от того, надо ли тебе его самому завершать или просто реагировать на его завершение.


Название: Re: Запуск с ожиданием
Отправлено: ViTech от Август 10, 2018, 11:45
Ну хорошо, зайдем с др стороны. Запустили процесс QProcess::startDetached, все Ок, но это [static] - как теперь дождаться его реального запуска (напр в течение 5 сек) чтобы след команда уже смогла передать ему данные ? Исходники QProcess::waitForStarted открывал, ну там обильные "трубы", выдрать не удастся, проще самому через нативняк.

А что является признаком того, что запущенный процесс готов к работе? То, что он запустился (сработал сигнал QProcess::started()) может ещё не означает, что он создал нужные каналы для общения, и всё равно придётся организовывать ожидание готовности к работе.


Название: Re: Запуск с ожиданием
Отправлено: Авварон от Август 10, 2018, 11:56
Ну хорошо, зайдем с др стороны. Запустили процесс QProcess::startDetached, все Ок, но это [static] - как теперь дождаться его реального запуска (напр в течение 5 сек) чтобы след команда уже смогла передать ему данные ? Исходники QProcess::waitForStarted открывал, ну там обильные "трубы", выдрать не удастся, проще самому через нативняк.

Я уже сказал, никак не дождаться, через 5 секунд по этому пиду может быть ДРУГОЙ процесс.
Так что только через трубки держать его; сломанная трубка значит что процесс умер.


Название: Re: Запуск с ожиданием
Отправлено: qate от Август 10, 2018, 12:22
Завершать созданный процесс нельзя - он нужен другим. 

по условиям задачи не очевидно что процесс будет нужен другим, тогда  https://stackoverflow.com/questions/17501642/detaching-a-started-process


Название: Re: Запуск с ожиданием
Отправлено: Igors от Август 10, 2018, 15:29
Я уже сказал, никак не дождаться, через 5 секунд по этому пиду может быть ДРУГОЙ процесс.
Так что только через трубки держать его; сломанная трубка значит что процесс умер.
А про пид(ов) разговора не было, след команда ищет по полному имени в списке процессов. Если есть - запись в шаред память

А что является признаком того, что запущенный процесс готов к работе? То, что он запустился (сработал сигнал QProcess::started()) может ещё не означает, что он создал нужные каналы для общения, и всё равно придётся организовывать ожидание готовности к работе.
Тот же ответ

тогда  https://stackoverflow.com/questions/17501642/detaching-a-started-process
Спасибо, интересный workaround, но где уверенность что setProcessState отменит прибитие? Ладно, покручусь в while 5 секунд, напр сканируя список процессов каждые 50 ms. "И на солнце есть пятна"