Russian Qt Forum
Ноябрь 27, 2024, 01:34
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Как можно приостановить процесс ?
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как можно приостановить процесс ? (Прочитано 14325 раз)
QtProger
Гость
Как можно приостановить процесс ?
«
:
Февраль 10, 2010, 17:55 »
Как с Qt приостановить процесс какой-нибудь программы по имени процесса ?
Записан
BlackTass
Гость
Re: Как можно приостановить процесс ?
«
Ответ #1 :
Февраль 10, 2010, 19:53 »
если под никсами то зовешь ps ax | grep process_name, парсишь его вывод, берешь оттуда pid и зовешь kill -9 pid
Это если наверняка надо. Если же просто послать сигнал завершения (который не обязательно завершит процесс), то killall process_name
Записан
QtProger
Гость
Re: Как можно приостановить процесс ?
«
Ответ #2 :
Февраль 10, 2010, 20:04 »
Цитата: BlackTass от Февраль 10, 2010, 19:53
если под никсами то зовешь ps ax | grep process_name, парсишь его вывод, берешь оттуда pid и зовешь kill -9 pid
Я слышал что Qt кроссплатформенна....
Цитата: BlackTass от Февраль 10, 2010, 19:53
Это если наверняка надо. Если же просто послать сигнал завершения (который не обязательно завершит процесс), то killall process_name
Завершать не надо, надо приостановить, чтобы потом можно было продолжить с прерванного места
Записан
BlackTass
Гость
Re: Как можно приостановить процесс ?
«
Ответ #3 :
Февраль 11, 2010, 20:17 »
Qt конечно кроссплатформенна, но подобные вещи являются уж совсем не кроссовыми и возможными не на всех платформах (на винде насколько я помню это недокументированная функция ntdll).
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как можно приостановить процесс ?
«
Ответ #4 :
Февраль 15, 2010, 07:21 »
Цитата: QtProger от Февраль 10, 2010, 20:04
Завершать не надо, надо приостановить, чтобы потом можно было продолжить с прерванного места
Процесс имеет хотя бы 1 нитку (thread), как ее остановить? Или даже: как процесс может остановить одну из своих же ниток? Да никак, можно только послать событие, выставить флаг и.т.п. полагая что код, выполняющийся в нитке, это "поймет" и перейдет напр. в ожидание на семафоре. Но если нитка этого не делает - заставить ее нечем. То же и с процессом.
Записан
sne
Гость
Re: Как можно приостановить процесс ?
«
Ответ #5 :
Февраль 15, 2010, 08:28 »
в никсах - черт его знает, а в винде:
Process32First, перечисляем все процессы, находим по имени процесса - PID
Thread32First, перечисляем все потоки, определяем относятся-ли они к нашему процессу
Открываем поочередно каждый из потоков, с правами, помимо всего прочего, на THREAD_SUSPEND_RESUME
А далее на вкус SuspendThread или КуыгьуThread, на выбор
По идее должно работать.
Записан
Павел_F.
Гость
Re: Как можно приостановить процесс ?
«
Ответ #6 :
Февраль 15, 2010, 09:35 »
Это, опять же, только "порекомендует" потоку остановиться. Но не заставит. Реакцию на такое предложение поток определит сам для себя. Никто не заставить поток встать. Гарантированно его можно только убить. Все остальное будет зависит от самого потока, как он написан, в какой момент ему придет это "предложение" подождать и т.д.
Записан
niXman
Гость
Re: Как можно приостановить процесс ?
«
Ответ #7 :
Февраль 15, 2010, 09:48 »
чтоб остановить поток/процесс, нужно сохранить его контекст, и и изъять его из списка обрабатываемых контекстов.
в никсах есть АПИ уровня ядра, но его невозможно использовать из прикладного уровня, сами понимаете. не вкурсе если в вендах такое есть, но думаю что нет. ибо не должно такого быть. если же есть надобность в подобном, это однозначно говорит об ошибке проектирования.
Записан
sne
Гость
Re: Как можно приостановить процесс ?
«
Ответ #8 :
Февраль 15, 2010, 23:20 »
Цитата: Павел_F. от Февраль 15, 2010, 09:35
Это, опять же, только "порекомендует" потоку остановиться. Но не заставит. Реакцию на такое предложение поток определит сам для себя. Никто не заставить поток встать. Гарантированно его можно только убить. Все остальное будет зависит от самого потока, как он написан, в какой момент ему придет это "предложение" подождать и т.д.
Это далеко не предложение
Если удастся открыть поток с нужными правами и функция SuspendThread вернет положительный результат - поток остановлен, факт.
Записан
Павел_F.
Гость
Re: Как можно приостановить процесс ?
«
Ответ #9 :
Февраль 16, 2010, 08:38 »
Цитата: sne от Февраль 15, 2010, 23:20
Если удастся открыть поток с нужными правами и функция SuspendThread вернет положительный результат - поток остановлен, факт.
Если удастся и если вернет это гарантированный результат? Я весь поток могу написать одной большой критической секцией. Не встанет он. А автор темы хочет чужие потоки тормозить. При этом не зная кто они и зачем нужны. Если я напишу прогу которая, например, реализует четыре потока( у меня четыре ядра) каждому потоку я скажу что он может выполнятся только на конкретном ядре, три потока будут считать а четвертый для синхронизации прочей служебной фигни. Что будет если какой-нибудь негодяй остановит поток для синхронизации??? Правильно или "мы все умрем" или фиг ему а не приостановка потока.
«
Последнее редактирование: Февраль 16, 2010, 08:41 от Павел_F.
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как можно приостановить процесс ?
«
Ответ #10 :
Февраль 16, 2010, 10:52 »
Цитата: sne от Февраль 15, 2010, 23:20
Это далеко не предложение
Если удастся открыть поток с нужными правами и функция 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
Гость
Re: Как можно приостановить процесс ?
«
Ответ #11 :
Февраль 16, 2010, 12:58 »
Павел_F
, если поток программы выполняющий приостановку потоков выполняется, то в любом случае, в твоем примере не все потоки работают
Че тут, пробовать надо, а не рассуждать о страшных последствиях
К тому же ситуация частная, и такое встретить в реальной жизни - шанс маленький. Способ не идеален, я не спорю, но вполне рабочий.
Igors
, в дедлок оно попадет при условии что:
а) используются объекты синхронизации (почти всегда часто)
б) мы останавливаем 1 поток с объектом синхронизации (тоже вполне может быть, и что?)
Разумеется остальные потоки будут ждать приостановленного нами. Но в конце концов мы же его запустим, вероятно не плохо бы при этом соблюсти порядок стэка для ResumeThread.
ЗЫ
Помимо критики, уважаемые, могут предлагать способы получше, либо меры по улучшению данного решения
ЗЗЫ
На счет кроссплатформенности, внимательно выше:
Цитата: sne от Февраль 15, 2010, 08:28
в никсах - черт его знает, а в винде:
«
Последнее редактирование: Февраль 16, 2010, 13:04 от sne
»
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: Как можно приостановить процесс ?
«
Ответ #12 :
Февраль 17, 2010, 07:08 »
Цитата: BlackTass от Февраль 10, 2010, 19:53
если под никсами то зовешь ps ax | grep process_name, парсишь его вывод, берешь оттуда pid и зовешь kill -9 pid
kill -STOP <pid>
продолжить -
kill -CONT <pid>
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Как можно приостановить процесс ?
«
Ответ #13 :
Февраль 17, 2010, 23:18 »
Цитата: sne от Февраль 16, 2010, 12:58
Че тут, пробовать надо, а не рассуждать о страшных последствиях
Попробовать-то не вредно, только вот заказчику я бы такую фичу не обещал - потому как не знаю что мне ему ответить если он спросит "Я за это заплатил, а оно вылетает, а на той платформе вообще не работает. Исправляйте как хотите, это Ваши проблемы".
Исходный вопрос надо понимать "есть ли легальная, кросс-платформенная возможность остановить процесс средствами Qt?" (пусть автор меня поправит если не так). Нормальный ответ на этот вопрос: нет, такой возможности нет. А хотите делать используя нативные средства ОС (крутизну показать) - дело Ваше, но это может дорого Вам обойтись.
Записан
sne
Гость
Re: Как можно приостановить процесс ?
«
Ответ #14 :
Февраль 18, 2010, 09:41 »
[floodMode]
Цитата: Igors от Февраль 17, 2010, 23:18
Исходный вопрос надо понимать "есть ли легальная, кросс-платформенная возможность остановить процесс средствами Qt?" (пусть автор меня поправит если не так). Нормальный ответ на этот вопрос: нет, такой возможности нет.
В Qt много чего нет, прослезитесь, но посмотрите исходники, того же самого qextSerialPort многострадального. Работы с последовательными портами в Qt тоже нет, и posix порт там реализован далеко не идеально, но когда кого это останавливало?
Цитата: Igors от Февраль 17, 2010, 23:18
А хотите делать используя нативные средства ОС (крутизну показать) - дело Ваше, но это может дорого Вам обойтись.
Не хотим, но есть такое слово как "надо", и против "надо", извините, не попрешь.
[/floodMode]
Заканчиваю флуд и более на подобные провокации не откликаюсь. Кто с чем не согласен, в личку, будьте добры, там мне не кому будет "крутизну показать".
Спасибо за внимание, всегда Ваш, возмущенный sne.
«
Последнее редактирование: Февраль 18, 2010, 21:51 от sne
»
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...