Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2008, 15:06   #1
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию Убить поток

Попытаюсь описать проблему на словах... Есть Form1. На ней лежит RzPageControl. У PageControl'а есть Sheet. Sheet - есть Parent form2. В Form2 создается поток в котором вызывается функция IcmpSendEcho, т.е. пингуем мы... Если на Form2 нажать Button и написать Thread.Terminate будет все ОК. Но проблема в том, что мне нужно корректно завершить поток при закрытии Form2. А оно происходит при нажатии на кнопе на PageControl, где в коде я написал Sheet.Destroy. Т.е. в Form2 посылается сообщение WM_DESTROY. Не получается при этом правильно завершить поток... Пытался перед Sheet.Destroy сделать sendMessage(...WM_CLOSE..), но результата не увидел. Проблема возникает тогда, когда IcmpSendEcho долго не отвечат, т.е., например, ждет ответа... Собственно повторяю вопрос -как при заданных условиях коректно убить поток?
Баламут вне форума Ответить с цитированием
Старый 21.03.2008, 16:12   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Баламут Посмотреть сообщение
Собственно повторяю вопрос -как при заданных условиях коректно убить поток?
Через синхронизацию... Через Event'ы, скажем. Или через PostThreadMessage нужному потоку. Смотря по конкретной реализации...
-----------------
Да, ещё, забыл сразу добавить, что, по-видимому, здесь лучше использовать не IcmpSendEcho, а IcmpSendEcho2 (win2k и выше, в связи с параметром ApcRoutine).

Последний раз редактировалось B_N; 21.03.2008 в 17:00.
B_N вне форума Ответить с цитированием
Старый 21.03.2008, 19:10   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Проблема возникает тогда, когда IcmpSendEcho долго не отвечат, т.е., например, ждет ответа
Может, я неправильно понял, но кто мешает при закрытии Form2 проконтролировать завершение пинга (ну, флажок какой-нибудь ставим в начале и снимаем по завершении) и выдавать сообщение вроде "Есть незавершенные операции, подождать их завершения?"
Если юзер не хочет ждать, программно жмем на Form2 Button (где написано Thread.Terminate), а затем закрываем Form2.
mihali4 вне форума Ответить с цитированием
Старый 22.03.2008, 05:04   #4
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Thread.Terminate здесь не прокатит по той простой причине, что метод просто выставляет флаг Terminated := true, т.е. вежливо просим поток завершиться. Он конечно же завершится, но вот форма давно уже будет убита. А отсюда и AV. Про IcmpSendEcho2 давненько уже думаю, т.к. она все-таки ассинхронна... Только вот чертовски лень переделывать код... Ладно, спасибо за ответы. Буду бороться с ленью...

P.S. Поспешил с ответом... Пожалуй Михалыч ты прав...

Последний раз редактировалось Баламут; 22.03.2008 в 05:13.
Баламут вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как убить процесс зная его имя? One.Love Win Api 14 18.02.2012 14:31
Поток Черничный Общие вопросы Delphi 5 27.09.2008 21:23
перенос данных!!! SOS начальник готов УБИТЬ((( Exo Microsoft Office Excel 25 11.02.2008 16:18