Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/40: Рейтинг темы: голосов - 40, средняя оценка - 4.63
10 / 11 / 3
Регистрация: 13.06.2015
Сообщений: 63
1

Завершение текущей программы из запускаемого процесса

13.06.2015, 19:55. Показов 7477. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. У меня имеется такая ситуация (пока все работает под винду):

есть некая программа, запускаемая с .exe-шника. Пусть будет называться main. В процессе выполнения этой программы с помощью QProcess запускается вспомогательная программа, которая должна прекратить выполнение main в корректной форме (с отработкой деструктора. Что-то наподобие QProcess::terminate, если правильно понимаю).

Пока из идей воспользоваться методом QThread::currentThread для получения указателя на текущий поток, и передавать его во вспомогательный процесс.

Вопросы в следующем - возможно ли с помощью указателя на QThread корректно завершить работу программы (и вообще правильно ли так делать с идеологической точки зрения).
И можно ли этот самый указатель передать во вспомогательный процесс? Например, создать экземпляр QProcess, запустить с его помощью программу и передать ему с помощью QProcess::writeData указатель (только как тогда эти данные считать "изнутри" вспомогательной программы)?


ps необязательный вопрос не совсем по теме - есть ли возможность Qt'шными средствами узнать, запущена ли программа (например, если известно ее имя)? Пока видел такое только средствами winapi. Видимо я пока плохо дружу с поиском - не смог найти такого обсуждения на форуме.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2015, 19:55
Ответы с готовыми решениями:

Завершение процесса
Пожалуйста подскажите что не правильно целый день маюсь Вылетает при нажатии: void...

Завершение дочернего процесса
Подскажите как правильно обработать завершение программы при вызове родителем QProcess::close()...

Принудительное завершение процесса
Осваиваюсь в Qt и хочу понять принцип работы этого фреймворка. В данном коде требуется из лайнэдита...

Ожидание завершение процесса
Здравствуйте, В общем проблема такая, у меня в программе идет запуск нескольких сторонних процессов...

36
10 / 11 / 3
Регистрация: 13.06.2015
Сообщений: 63
17.06.2015, 22:17  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
Обвертку над чем
над неким функционалом, позволяющим реализовать то, что я хотел.
Я хотел найти какой-то простой способ наблюдать за прекращением работы программы со стороны другой программы, которая запускается из первой. И если нет готового решения (например создать объект QProcess, с помощью которого контролируется работа главной программы, и передать его во вспомогательную), то я буду использовать другие варианты. Например из предложенных вами.

Добавлено через 5 минут
Цитата Сообщение от Drus Посмотреть сообщение
вмонтировать QTcp непосредственно в запускатор
если правильно понял, то вы предлагаете ввести еще одну программу? Просто у меня и так мешанина получается - моя основная программа служит для запуска и контроля работы еще двух программ. И есть обновлялка для основной программы. И, если ввести еще одну программу, станет все совсем громоздко. То есть идея хороша, но в моем случае проще будет ввести в апдейтер задержку чуть побольше и кидаться сообщениями при неудаче обновления.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.06.2015, 23:18 22
Цитата Сообщение от atForce Посмотреть сообщение
над неким функционалом,
Чем чем ?

Я конерентно описал что нужно сделать, вы же продолжаете что-то толдычить и бубнеть себе под нос...
0
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
18.06.2015, 08:02 23
Как бы в одном из проектов, к написанию которого я отношения не имею, но существует это все очень давно, запускатор, он же апдейтер - относительно небольшая програмка, живущая в системном трее, которая как раз сообщает о новых версиях, останавливает программы, сообщает о сбоях в работе, обновляет файлы, в том числе с проверкой чексуммы...
Идите этим путем. То есть есть основная прога Run.exe, которая тупо следит за Louncher.exe ( он же апдейтер ) и в случае его завершения смотрит, в папку, находит самый новый Лаунчер ( Louncher_v2_0_0_1.exe ) и запускает его. При этом эта же прога спокойна следит и за утилизацией всех старых версий лаунчера, к примеру если пользователь решил старый экзешник потереть, ну или если наоборот апдейт на его машине не заработал как нужно и он решил откатиться.
Падать в Run.exe просто негде!!! То есть это архистабильная субстанция, а если еще и проверку доступной памяти прикрутить - то вообще упасть не сможет, кроме как от рук пользователя.
Кроме того, тот же самый Louncher спокойно стартует и без Run.exe и позволяет обновиться до любой нужной версии.

Вариантов конечно у вас уже уйма. Если не получится один - пробуйте другой, то есть тут посоветовать что-то сверху мне кажется уже сложно.
0
137 / 107 / 23
Регистрация: 06.10.2008
Сообщений: 451
18.06.2015, 12:15 24
А если попробовать вариант наоборот.
Изначально, фоном, запускается вторая программа, которая стартует и следит за работой первой (следит за main). В нужный момент она ее терминатит, меняет эхешники и тп и запускает по новой?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.06.2015, 15:20 25
Цитата Сообщение от Drus Посмотреть сообщение
он же апдейтер - относительно небольшая програмка, живущая в системном трее,
Ну некоторые пррограммы имеют сервис для обновления.
Но все это ерунда ибо никак не решает указанной проблемы.
0
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
18.06.2015, 15:37 26
Цитата Сообщение от Avazart Посмотреть сообщение
Ну некоторые пррограммы имеют сервис для обновления.
Но все это ерунда ибо никак не решает указанной проблемы.
Я к тому что не вижу проблемы как таковой, ради которой такие пляски с бубном нужны. ну крашнулось приложение и как бе фиг с ним. в логах написано будет и код возврата( если на него кто-то смотрит) и возможный путь следования на пути к "обрыву", если включить Trace в вызовы функций, ну на "совсем плохой исход" удаленно дебаггером можно присоединиться. Или я чего-то не понимаю?

Какой такой случай какого приложения может заставить так извращаться, вот тут у меня реально ступор случается. Драйвер хасп ключей пишется? =)
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.06.2015, 15:42 27
Че не понятно- прога может нагнуться от обновления, когда будуть подменяться файлы старой версии новыми, часть заменится а часть нет- из-за того что часть старых файлов будет открыто в старой версии экзешника ну и сам старый экзешник будет неизменен.
0
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
18.06.2015, 15:50 28
Понял... Я такой вариант использования даже представить не мог... что можно грузить сразу заменяя.
Как бы в моем представлении грузиться должно в отдельную папочку, после чего отправляется сигнал "Главному котроллу" о том что "прибей приложение" и перезапиши файлы новыми. Уж извините, но сразу менять файлы загружаемыми бред... Поэтому я проблемы и не вижу. Если "Главный котролл" не сможет перезаписать файлы новыми - то он об этом скажет. Сам он вообще QT может не использовать и дергать только системные библиотеки или вообще батником быть. Поэтому я так и удивляюсь.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.06.2015, 16:04 29
Какая разница сразу или не сразу заменять? Вы вообще тему читали?
Проблема как раз в части:
Цитата Сообщение от Drus Посмотреть сообщение
после чего отправляется сигнал "Главному котроллу" о том что "прибей приложение" и перезапиши файлы новыми.
Как вы это собираетесь делать? Если что-то тут пойдет не так, то получите ту проблему которую я описал с подменой файлов.
Цитата Сообщение от Drus Посмотреть сообщение
ам он вообще QT может не использовать и дергать только системные библиотеки или вообще батником быть. Поэтому я так и удивляюсь.
Не может быть это батником, во превых уже сказали что нужно "мягкое" завершение, во вторых стоило бы отлавливать ошибки, в друг не удастя убить?
Системные же либы как я говорил не кроссплатформенный вариант.
0
57 / 57 / 1
Регистрация: 07.10.2011
Сообщений: 203
18.06.2015, 16:25 30
Ну ладно, допустим кто-то левый блокирует файлы, которые необходимо заменить и не знаем кто ( худший случай ).
Если использовать переменную path для задания приоритета места загрузки? такое может быть использовано? То есть есть те же самые папки, с инкрементальным значением апдейта( 0_0_1, 0_0_2 ), искать подключаемые компоненты система будет строго с их последовательностью?
Убили известные процессы и заново запустили.

С мягким завершение приложения мне думалось там проблем вообще нет, столько способов накидали.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.06.2015, 16:48 31
Цитата Сообщение от Drus Посмотреть сообщение
Ну ладно, допустим кто-то левый блокирует файлы,
Ну думаю это уже проблемы этого "левого". Другое дело если исполняемый файл не завершился и держит файлы открытыми.

Добавлено через 2 минуты
Цитата Сообщение от Drus Посмотреть сообщение
С мягким завершение приложения мне думалось там проблем вообще нет, столько способов накидали.
Вообщето способов всего два:
1. Оповестить программу что она может сам закрыться и выждать время - не так надежно.
2. Послать к примеру WM_CLOSE (или как-то иначе оповестить) и ждать закрытия WaitFoSingleObject() зная хендл - не кроссплатформенно.
0
10 / 11 / 3
Регистрация: 13.06.2015
Сообщений: 63
14.07.2015, 17:04  [ТС] 32
Цитата Сообщение от Avazart Посмотреть сообщение
Чем чем ?
прошу прощения за некорректный подбор терминов)

Всем огромное спасибо за все варианты - принял к сведению на будущее.
На данный момент пришлось обновление сделать таким образом, при котором главная программа сама себя завершает, а апдейтер выжидает какое-то время и пытается перезаписать ехе'шник (если не получается, возвращает все назад). В дальнейшем, как решатся более срочные задачи, надеюсь переделать.

Изначальное желание завершать работу основной программы не "изнутри", а апдейтером было вызвано тем, что возможность доступа к машине, на которой крутится программа, скорее всего будет сильно ограничена, потому хотелось оставить как можно меньше возможностей для разных не обрабатываемых случайностей.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
27.11.2015, 13:42 33
atForce, у меня была не такая, но похожая проблема, связанная с обновлением. Дело в том, что обновлялка тоже может обновиться. А поскольку я тупо писал новые файла на место старых (с откатом), то во время работы обновлялка никак не хотела перезаписываться, виндоус не велит (что естественно и логично).
Выход оказался неожиданным. Переименование выполняемого в данный момент экзешника - допускается! И пиши свою обновлялку под старым именем...
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.11.2015, 14:15 34
Цитата Сообщение от Байт Посмотреть сообщение
Переименование выполняемого в данный момент экзешника - допускается!
Насколько я помню нет.
0
72 / 72 / 33
Регистрация: 07.11.2015
Сообщений: 281
27.11.2015, 14:24 35
Недавно сам с этим заморачивался. Под windows можно переименовывать. Под linux еще и удалять. OS X обхожу стороной
1
10 / 11 / 3
Регистрация: 13.06.2015
Сообщений: 63
30.11.2015, 14:53  [ТС] 36
Цитата Сообщение от Байт Посмотреть сообщение
обновлялка тоже может обновиться
у меня с этим немного проще - моя основная программа - что-то вроде админки, следящей за выполнением пары других программ, заодно обновляющая как сами программы, так и их конфиги. И вот эту админку надо было тоже обновлять - что я и делал с помощью доп. программы. То есть в моем случае задачу обновления обновлялки выполняет основная программа.
И загвоздка была именно в том, чтобы обновлялка контролировала момент завершения основной программы максимально точно.

Добавлено через 2 минуты
кстати, как-нибудь можно отметить тему, как решенную? Кроме указания "правильного ответа".
0
Avazart
30.11.2015, 15:23     Завершение текущей программы из запускаемого процесса
  #37

Не по теме:

Цитата Сообщение от atForce Посмотреть сообщение
отметить тему, как решенную?
Нет такой отметки на форуме.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2015, 15:23

Завершение процесса из Qt напрямую
Можно ли из Qt напрямую завершать процессы? Знаю, что есть функция close(), но разобраться с ней не...

Завершение процесса gdb linux
Здравствуйте. В проекте всегда работала отладка. При очередном запуске выскочила ошибка "завершение...

Отследить завершение произвольного процесса.
День добрый! Вообщем стоит задача, при запуске приложения стартовать др приложение, и следить за...

Завершение процесса до запуска программы
Используя код Process.Start() заметил один косяк. Так как у меня Win7, при запуске он спрашивает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru