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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как можно приостановить процесс ?  (Прочитано 14325 раз)
QtProger
Гость
« : Февраль 10, 2010, 17:55 »

Как с Qt приостановить процесс какой-нибудь программы по имени процесса ?
Записан
BlackTass
Гость
« Ответ #1 : Февраль 10, 2010, 19:53 »

если под никсами то зовешь ps ax | grep process_name, парсишь его вывод, берешь оттуда pid и зовешь kill -9 pid
Это если наверняка надо. Если же просто послать сигнал завершения (который не обязательно завершит процесс), то killall process_name
Записан
QtProger
Гость
« Ответ #2 : Февраль 10, 2010, 20:04 »

если под никсами то зовешь ps ax | grep process_name, парсишь его вывод, берешь оттуда pid и зовешь kill -9 pid

Я слышал что Qt кроссплатформенна....

Это если наверняка надо. Если же просто послать сигнал завершения (который не обязательно завершит процесс), то killall process_name

Завершать не надо, надо приостановить, чтобы потом можно было продолжить с прерванного места
Записан
BlackTass
Гость
« Ответ #3 : Февраль 11, 2010, 20:17 »

Qt конечно кроссплатформенна, но подобные вещи являются уж совсем не кроссовыми и возможными не на всех платформах (на винде насколько я помню это недокументированная функция ntdll).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 15, 2010, 07:21 »

Завершать не надо, надо приостановить, чтобы потом можно было продолжить с прерванного места
Процесс имеет хотя бы 1 нитку (thread), как ее остановить? Или даже: как процесс может остановить одну из своих же ниток? Да никак, можно только послать событие, выставить флаг и.т.п. полагая что код, выполняющийся в нитке, это "поймет" и перейдет напр. в ожидание на семафоре. Но если нитка этого не делает - заставить ее нечем. То же и с процессом.
Записан
sne
Гость
« Ответ #5 : Февраль 15, 2010, 08:28 »

в никсах - черт его знает, а в винде:
  • Process32First, перечисляем все процессы, находим по имени процесса - PID
  • Thread32First, перечисляем все потоки, определяем относятся-ли они к нашему процессу
  • Открываем поочередно каждый из потоков, с правами, помимо всего прочего, на THREAD_SUSPEND_RESUME
  • А далее на вкус SuspendThread или КуыгьуThread, на выбор

По идее должно работать.
Записан
Павел_F.
Гость
« Ответ #6 : Февраль 15, 2010, 09:35 »

Это, опять же, только "порекомендует" потоку остановиться. Но не заставит. Реакцию на такое предложение поток определит сам для себя. Никто не заставить поток встать. Гарантированно его можно только убить. Все остальное будет зависит от самого потока, как он написан, в какой момент ему придет это "предложение" подождать и т.д.
Записан
niXman
Гость
« Ответ #7 : Февраль 15, 2010, 09:48 »

чтоб остановить поток/процесс, нужно сохранить его контекст, и и изъять его из списка обрабатываемых контекстов.
в никсах есть АПИ уровня ядра, но его невозможно использовать из прикладного уровня, сами понимаете. не вкурсе если в вендах такое есть, но думаю что нет. ибо не должно такого быть. если же есть надобность в подобном, это однозначно говорит об ошибке проектирования.
Записан
sne
Гость
« Ответ #8 : Февраль 15, 2010, 23:20 »

Это, опять же, только "порекомендует" потоку остановиться. Но не заставит. Реакцию на такое предложение поток определит сам для себя. Никто не заставить поток встать. Гарантированно его можно только убить. Все остальное будет зависит от самого потока, как он написан, в какой момент ему придет это "предложение" подождать и т.д.
Это далеко не предложение Улыбающийся Если удастся открыть поток с нужными правами и функция SuspendThread вернет положительный результат - поток остановлен, факт.
Записан
Павел_F.
Гость
« Ответ #9 : Февраль 16, 2010, 08:38 »

Если удастся открыть поток с нужными правами и функция SuspendThread вернет положительный результат - поток остановлен, факт.
Если удастся и если вернет это гарантированный результат? Я весь поток могу написать одной большой критической секцией. Не встанет он. А автор темы хочет чужие потоки тормозить. При этом не зная кто они и зачем нужны. Если я напишу прогу которая, например, реализует четыре потока( у меня четыре ядра) каждому потоку я скажу что он может выполнятся только на конкретном ядре, три потока будут считать а четвертый для синхронизации прочей служебной фигни. Что будет если какой-нибудь негодяй остановит поток для синхронизации??? Правильно или "мы все умрем" или фиг ему а не приостановка потока.
« Последнее редактирование: Февраль 16, 2010, 08:41 от Павел_F. » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Февраль 16, 2010, 10:52 »

Это далеко не предложение Улыбающийся Если удастся открыть поток с нужными правами и функция SuspendThread вернет положительный результат - поток остановлен, факт.
Ладно, расширим наш багаж знаний, читаем MSDN
Цитировать
This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization. Calling SuspendThread on a thread that owns a synchronization object, such as a mutex or critical section, can lead to a deadlock if the calling thread tries to obtain a synchronization object owned by a suspended thread. To avoid this situation, a thread within an application that is not a debugger should signal the other thread to suspend itself. The target thread must be designed to watch for this signal and respond appropriately.
Оно конечно, "нет преград энтузиастам", но мне кажется - связываться с таким мутным делом не резон, скорее всего не остановим, а покалечим. Ну и кросс-платформенностью там и не пахнет. Напр. в Posix такого точно нет
Записан
sne
Гость
« Ответ #11 : Февраль 16, 2010, 12:58 »

Павел_F, если поток программы выполняющий приостановку потоков выполняется, то в любом случае, в твоем примере не все потоки работают Подмигивающий Че тут, пробовать надо, а не рассуждать о страшных последствиях Улыбающийся К тому же ситуация частная, и такое встретить в реальной жизни - шанс маленький. Способ не идеален, я не спорю, но вполне рабочий.

Igors, в дедлок оно попадет при условии что:
а) используются объекты синхронизации (почти всегда часто)
б) мы останавливаем 1 поток с объектом синхронизации (тоже вполне может быть, и что?)

Разумеется остальные потоки будут ждать приостановленного нами. Но в конце концов мы же его запустим, вероятно не плохо бы при этом соблюсти порядок стэка для ResumeThread.

ЗЫ
Помимо критики, уважаемые, могут предлагать способы получше, либо меры по улучшению данного решения Подмигивающий

ЗЗЫ
На счет кроссплатформенности, внимательно выше:
в никсах - черт его знает, а в винде:
« Последнее редактирование: Февраль 16, 2010, 13:04 от sne » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #12 : Февраль 17, 2010, 07:08 »

если под никсами то зовешь ps ax | grep process_name, парсишь его вывод, берешь оттуда pid и зовешь kill -9 pid

kill -STOP <pid>

продолжить -

kill -CONT <pid>
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Февраль 17, 2010, 23:18 »

Че тут, пробовать надо, а не рассуждать о страшных последствиях Улыбающийся
Попробовать-то не вредно, только вот заказчику я бы такую фичу не обещал - потому как не знаю что мне ему ответить если он спросит "Я за это заплатил, а оно вылетает, а на той платформе вообще не работает. Исправляйте как хотите, это Ваши проблемы".

Исходный вопрос надо понимать "есть ли легальная, кросс-платформенная возможность остановить процесс средствами Qt?" (пусть автор меня поправит если не так). Нормальный ответ на этот вопрос: нет, такой возможности нет. А хотите делать используя нативные средства ОС (крутизну  показать) - дело Ваше, но это может дорого Вам обойтись.
Записан
sne
Гость
« Ответ #14 : Февраль 18, 2010, 09:41 »

[floodMode]

Исходный вопрос надо понимать "есть ли легальная, кросс-платформенная возможность остановить процесс средствами Qt?" (пусть автор меня поправит если не так). Нормальный ответ на этот вопрос: нет, такой возможности нет.
В Qt много чего нет, прослезитесь, но посмотрите исходники, того же самого qextSerialPort многострадального. Работы с последовательными портами в Qt тоже нет, и posix порт там реализован далеко не идеально, но когда кого это останавливало?

А хотите делать используя нативные средства ОС (крутизну  показать) - дело Ваше, но это может дорого Вам обойтись.
Не хотим, но есть такое слово как "надо", и против "надо", извините, не попрешь.

[/floodMode]

Заканчиваю флуд и более на подобные провокации не откликаюсь. Кто с чем не согласен, в личку, будьте добры, там мне не кому будет "крутизну показать".
Спасибо за внимание, всегда Ваш, возмущенный sne. Улыбающийся
« Последнее редактирование: Февраль 18, 2010, 21:51 от sne » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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