Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/12: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30

Прибить программу, находясь в потоке

16.12.2010, 22:16. Показов 2311. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется многопоточная программа. В потоке может совершиться некое иключительное нехорошее действие. При совершении этого действия на текущий момент самым надёжным решением было бы убить всю программу со всеми потоками БЕЗ сохранения конфигов (грубо говоря, чтобы НЕ вызвался деструктор главного окна и т.п.). При вызове Application->Terminate убивается только поток, а сама программа становится в раскоряку и что-то начинает чудить.

Как можно надёжно прибить всю программу из потока?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2010, 22:16
Ответы с готовыми решениями:

Прибить Footer
Добрый день, товарищи. Помогите прибить футер к низу странички, пожалуйста. Поиском пользовался. Структура такая: ...

как прибить вирус
Постоянно выключается касперский, но в первый раз отключился не только он, но и брандмауэр. На вторые и последующие отключения брандмауер...

Ждать или прибить
Бывает переодически, стоит нужная ссылка на тебя и в один прекрасный момент она исчезает,при проверке на индексацию Яшкой через сервис...

11
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
17.12.2010, 00:28
Цитата Сообщение от Evg Посмотреть сообщение
При вызове Application->Terminate убивается только поток
Нельзя вообще из потока такое вызывать. Только в потоке, управляемом самом IDE такой метод обработает корректно (как правило, подобные объекты должны быть в области __published: // IDE-managed Components).
Вот так будет корректнее:
C++
1
PostMessage(MainControl->Handle,WM_QUIT,NULL,NULL);
Вместо "MainControl" должен быть дескриптор главной формы приложения.
То есть, если поток метод (или объект) класса главной формы, то можно и
C++
1
this->Handle;
Иначе, в классе TApplication тоже предусмотрено хранение дескриптора главной формы. Достучаться до него можно так:
C++
1
Application->MainForm->Handle;
Или же вот так:
C++
1
Application->MainFormHandle;

Не по теме:

Как по мне, облегчает ношу - не нужно хранить где-нибудь указатель на главную форму, всё уже автоматизировано...

2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.12.2010, 09:17  [ТС]
Цитата Сообщение от MikeSoft Посмотреть сообщение
от так будет корректнее:
А WM_QUIT соответствует "нормальному" выходу или "немедленному завершению"? Просто по названию мне всё-таки кажется, что первое (хотя надо экспериментировать)
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
17.12.2010, 14:47
Цитата Сообщение от Evg Посмотреть сообщение
А WM_QUIT соответствует "нормальному" выходу или "немедленному завершению"?
WM_QUIT соответствует принудительному завершению.
Из-за этого в MSDN сказано:
Do not post the WM_QUIT message using the PostMessage function; use PostQuitMessage.
PostQuitMessage из потока не поможет.

"Нормальному" завершению соответствует WM_CLOSE.
Однако, WM_CLOSE инициирует проход по остальным событиям, в которых пользователь мог запретить завершение приложения (такие как OnCloseQuery, OnClose). Поэтому не всегда можно ожидать того, что приложение будет завершено.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.12.2010, 15:06  [ТС]
Т.е. сентенция какая? То, что написано в посте #2 не поможет?

Нужно делать ручками типа отправить сообщение (WM_USER) главному окну, а в обработкике главного окна (которое запустится именно в главном процессе, а не в потоке) запустить Apllication->Terminate?
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
17.12.2010, 15:12
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. сентенция какая? То, что написано в посте #2 не поможет?
Поможет.
Меня данный метод ещё ни разу не подвёл.

Цитата Сообщение от Evg Посмотреть сообщение
Нужно делать ручками типа отправить сообщение (WM_USER) главному окну, а в обработкике главного окна (которое запустится именно в главном процессе, а не в потоке) запустить Application->Terminate?
Если выполнять Application->Terminate; , то нет смысла так извращаться.
Если просто Close(); и при этом не забывать о возможных запретах в OnCloseQuery и остановке потока - то стоит попробовать
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.12.2010, 15:16  [ТС]
Цитата Сообщение от MikeSoft Посмотреть сообщение
Поможет.
Меня данный метод ещё ни разу не подвёл.
Тогда к чему было написано "PostQuitMessage из потока не поможет."?

Цитата Сообщение от MikeSoft Посмотреть сообщение
Если выполнять Application->Terminate; , то нет смысла так извращаться.
Так из потока его нельзя запускать. Из потока можно только "свистнуть", чтобы главный процесс исполнил Application->Terminate

Цитата Сообщение от MikeSoft Посмотреть сообщение
Если просто Close();
Просто Close делает нормальное завершение (т.е. в моём случае это означает сохранение онфигов и т.п., что мне как раз-таки и не нужно)
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
17.12.2010, 15:48
Цитата Сообщение от Evg Посмотреть сообщение
Тогда к чему было написано "PostQuitMessage из потока не поможет."?
Был задан вопрос:
Т.е. сентенция какая? То, что написано в посте #2 не поможет?
Во втором посте я написал метод:
C++
1
PostMessage(MainControl->Handle,WM_QUIT,NULL,NULL);
О PostQuitMessage я упомянул в #4 (это обычная рекомендация из WinAPI).
PostQuitMessage не выполняется из потока.
Для выполнения из потока нужно использовать PostMessage.
Цитата Сообщение от Evg Посмотреть сообщение
Так из потока его нельзя запускать. Из потока можно только "свистнуть", чтобы главный процесс исполнил Application->Terminate
Похоже, ты немного меня не понял.
Тобою было предложено отправлять WM_USER главному окну. Обработает сообщение основной поток, а поток, созданный тобою (второстепенный) всего лишь выполнит передачу сообщения основному. Что и называется "свистнуть".
Это означает, что второстепенный поток не будет выполнять работу основного.

Цитата Сообщение от Evg Посмотреть сообщение
Просто Close делает нормальное завершение (т.е. в моём случае это означает сохранение онфигов и т.п., что мне как раз-таки и не нужно)
Тогда можно ещё в сторону WM_DESTROY посмотреть.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.12.2010, 15:59  [ТС]
В той статье написано

WM_QUIT может посылать только WinMain() и должна это делать. И Windows и Вы сами не должны посылать сообщение WM_QUIT. Это сделано для того, чтобы окно могло освободить все использованные им ресурсы.
Т.е. WM_DESTROY больше смахивает на истину
0
2742 / 1668 / 269
Регистрация: 19.02.2010
Сообщений: 4,413
18.12.2010, 00:18
Лучший ответ Сообщение было отмечено VTsaregorodtsev как решение

Решение

WinAPI рулило, рулит и будет рулить

ExitProcess(0) надежнейшим образом убивает прогу из любого её потока. Деструкторы созданных в программе объектов при этом не вызываются (т.е. никакой "лишней" работы прога больше не выполнит - всю распределенную память очистит сама система, сама система закроет и все открытые файлы и прочие дескрипторы виндовозовских объектов).
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.12.2010, 16:31  [ТС]
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
ExitProcess(0)
Попробуем
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.12.2010, 17:43  [ТС]
А как можно убить только текущий поток?

Добавлено через 3 минуты
На текущий момент заиспользовал ExitProcess, а то с WM_DESTROY что-то слишком умно получается

Добавлено через 9 минут
Цитата Сообщение от Evg Посмотреть сообщение
А как можно убить только текущий поток?
C
1
int *p = 0; *p = 0;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2010, 17:43
Помогаю со студенческими работами здесь

Не возможно прибить HpUI.exe
Здравствуйте! Пожалуйста, помогите решить проблему. Windows Vista Не возможно прибить HpUI.exe. Он автоматически запускается снова....

Как прибить Acknowledge [Ethernet]
Кто знает, как можно симулировать отсутствие Ack. Сервер на моей машине, хочу чтобы пакет Acknowtidge от моего сервера был прибит, причём...

Не получается прибить блок к низу
Здравствуйте. Левая колонка фиксированная остаётся на месте а содержимое контента прокручивается. Помогите пожалуйста прибить блок...

recv в отдельном потоке блокирует программу
Код сервера: //--------------------------------------------------------------------------- #include <vcl.h> #include...

Как прибить footer на динамической странице
Как прибить footer на динамической странице? На некоторых страницах, стоит все нормально, а как открою страницу там где выводит список...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru