Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Как уничтожить спящий или подвисший поток?   Найти похожие ветки 

 
w666w   (2003-09-10 17:50) [0]

Допустим поток в данный момент выполняет sleep(10000). Соответственно на флаг Terminated он обратит внимание только после истечения этого времени. Как немедленно сообщить ему, что необходимо прервать все действия и немедленно прекратить свое выполнение? Есть мысли по поводу PostThreadMessage, но почемуто поток не ловит это сообщение. Подскажите решение.

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


 
MBo   (2003-09-10 17:52) [1]

А не делай такой длинный sleep
жестоко - TerminateThread


 
clickmaker   (2003-09-10 17:57) [2]

Заместо Sleep поставь WaitForSingleObject(какой нибудь объект синхронизации, н-р, Event). А при завершении просто ставь этот объект в сигнальное состояние, типа SetEvent


 
w666w   (2003-09-10 17:59) [3]

Sleep я дал для примераю На самом деле поток устанавливает HTTP соединение (idHTTP), и пока либо не загрузит ресурс, либо не будет какого-либо исключения - не отзывается ни на что. Т.Е. в данном случае роль sleep фактически выполняет TimeOut соединения. Ну неужели нет никаких способов определить какой-либо более приоритетный флаг (или Message), на который поток обращает внимание постоянно, не зависимо от того, что он делает?

Насчет TerminateThread - фишка в том, что idHTTP при соединении открывает для себя еще один поток - получаем 1 поток, вызвавший соединение, 2-й - поток INDY. И TerminateThread напрочь отказывается работать. Поток на него просто никак не реагирует.


 
w666w   (2003-09-10 18:02) [4]

Кстати такая же проблема возникает при, допустим, пинговании хоста с таймаутом, или определении имени хоста по IP. Проблема в том, что я хочу при закрытии программы прекратить выполнение всех потоков НЕМЕДЛЕННО и без каких либо рассуждений. Ну конечно желательно, чтобы деструктор потока все же отработал....


 
w666w   (2003-09-10 18:40) [5]

Мастера, помогите, вопрос очень актуальный на самом то деле. Нигде не видел ответов на эту тему. Подскажите...


 
clickmaker   (2003-09-10 18:48) [6]

На ум приходит только: найти ID потока INDY и убить его. Кстати, чтобы можно было сделать TerminateThread, поток должен быть открыт с правом доступа THREAD_TERMINATE. Может в этом дело ?


 
w666w   (2003-09-10 18:56) [7]

Как установить право доступа на поток THREAD_TERMINATE?

Насчет INDY вся фишка в том, что вообще непонятно как эти потоки появляются, допустим у меня 250 потоков делают коннект, а потоков инди появляется 35, допустим. Там какой-то непонятный алгоритм запуска доп. потоков, все отслеживать и убивать по одному - гемор страшный. Я в панике :(


 
panov   (2003-09-10 19:02) [8]

Ну что ты хочешь... это издержки при использовании компонент.
Иногда за удобство приходится платить...


 
panov   (2003-09-10 19:03) [9]

Используй Sockets API


 
clickmaker   (2003-09-10 19:05) [10]

Хотя, с другой стороны, если юзается Handle, возвращенный CreateThread, он уже имеет полный доступ...

А INDY как юзается? В виде DLL? Потому что, если так, то как пишет MSDN "DLLs attached to the thread are not notified that the thread is terminating."

Т.е. INDY может и не узнать, что вызвавший его поток уже скончался


 
w666w   (2003-09-10 19:05) [11]

Ладно, про Indy пока забыли. Вернемся к первоначальной проблеме, озвученной в первом посте. поток делает sleep и т.д. Как его заставить отреагировать на что-либо? Ну есть же способы, 100%...


 
panov   (2003-09-10 19:11) [12]

>w666w (10.09.03 19:05) [11]
Ладно, про Indy пока забыли. Вернемся к первоначальной проблеме, озвученной в первом посте. поток делает sleep и т.д. Как его заставить отреагировать на что-либо? Ну есть же способы, 100%...

Как раз если не использовать Indy, то проблема решается просто.
1. Интервал ожидания дробишь на мелкие куски и выполняешь в цикле проверку на Terminated
2. Используешь Event object, что красивее будет.


 
w666w   (2003-09-11 14:53) [13]

Задача именно прервать sleep, а не дробить его. Есто вообще, хотя бы теоретически возможно или нет?


 
Verg   (2003-09-11 15:12) [14]

Прервать sleep невозможно.
sleep - это не процесс чего либо, чтобы его прерывать. Sleep - это указание системе НЕ распределять кванты времени на этот поток в течение указанного времени.

panov тебе дело говорит, чес-слово:


> 2. Используешь Event object, что красивее будет.


 
panov   (2003-09-11 16:17) [15]

Кстати, специально проверил TerminateThread с TidHTTP - поток убивается сразу и задержки при закрытии приложения нет совсем.

То, что болтается еще один поток, так это не должно тебя волновать, ты задачу и так убиваешь жестоко.


 
guest   (2003-09-13 14:40) [16]

дела SLeepEx() с параметром Фдукефиду=true (MSDN)

"
bAlertable
[in] If this parameter is FALSE, the function does not return until the time-out period has elapsed. If an I/O completion callback occurs, the function does not return and the I/O completion function is not executed. If an APC is queued to the thread, the function does not return and the APC function is not executed.
If the parameter is TRUE and the thread that called this function is the same thread that called the extended I/O function (ReadFileEx or WriteFileEx), the function returns when either the time-out period has elapsed or when an I/O completion callback function occurs. If an I/O completion callback occurs, the I/O completion function is called. If an APC is queued to the thread (QueueUserAPC), the function returns when either the timer-out period has elapsed or when the APC function is called.

"



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.035 c
14-41908
men-person
2003-10-21 14:40
2003.11.13
приколы


4-42311
Demetrius
2003-09-17 19:03
2003.11.13
WinInet


1-41388
denis24
2003-10-29 17:10
2003.11.13
проверка значения в ячейке StringGrida


1-41347
Mistic
2003-10-29 22:10
2003.11.13
системное меню


3-41022
Nikolai_S
2003-10-15 18:41
2003.11.13
Как обновить только одну конкретную запись в TADOTable?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский