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

Вниз

TerminateThread - почему не работает?   Найти похожие ветки 

 
w666w   (2003-09-30 12:29) [0]

Объясните плиз, почему может не выполнятся TerminateThread для потока? GetLastError также не хранит никакого кода ошибки, поэтому понять суть происходящего я вообще не могу :(. Читал, что в Win2000 для выполнения этой процедуры поток должен иметь права на уничтожение THREAD_TERMINATE, но как эти права выставлять? И кем?

Как правильно вызывать этот метод? С каким кодом dwExitCode (и вообще какие они бывают и для чего). Нужно ли приостанавливать поток (Suspend) перед вызовом TerminateThread и влияет ли это как нибудь на вызов этой функции или нет? Как вручную очистить память после уничтожения потока при TerminateThread и т.п.

Заранее спасибо!


 
Игорь Шевченко   (2003-09-30 12:45) [1]

А help почитать не судьба ? Или опять тестирование телепатических способностей ?


 
w666w   (2003-09-30 12:54) [2]

В том то и дело, что в help"е про TerminateThread вообще ни одной строчки нет :(. По крайней мере в D7 Enterprise


 
likeanangel   (2003-09-30 12:56) [3]

А ты уверен, что тебе нужен именно TerminateThread() ?! Вобщем-то, это достаточно скользкий тип программирования, потому что при вызове этой функции могут остаться какие-то аллоцированные ресурсы, хэндлеры, какие-то библиотеки не получат DLL_THREAD_DETACH и т.д. Гораздо разумнее завершить функцию потока естественным путем.


 
w666w   (2003-09-30 12:59) [4]

DLL я в проекте не использую, а вот моментальное уничтожение потоков при выходе из программы ООЧЕНЬ необходимо. К сожалению естественным путем обрубить поток у меня не получается, нужен именно TT.


 
Verg   (2003-09-30 13:02) [5]


> К сожалению естественным путем обрубить поток у меня не
> получается, нужен именно TT.


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


 
Игорь Шевченко   (2003-09-30 13:05) [6]

w666w (30.09.03 12:54)

http://msdn.microsoft.com


 
Verg   (2003-09-30 13:07) [7]


> Объясните плиз, почему может не выполнятся TerminateThread
> для потока


Откуда ты знаешь, что он не выполнился?

А вообще вот это читал?

Terminating a thread does not necessarily remove the thread object from the system. A thread object is deleted when the last thread handle is closed.


 
N169   (2003-09-30 13:13) [8]

А может коллега объект типа TThread уничтожает с помощью CloseHandle()? :)


 
Digitman   (2003-09-30 13:15) [9]


> естественным путем обрубить поток у меня не получается


это почему же ? что, ты не в состоянии реализовать такой алгоритм поточной ф-ции, который будет достаточно оперативно (синхронно или асинхронно) реагировать на некую предопределенную "команду" извне, требующую немедленного завершения поточной ф-ции ?


 
w666w   (2003-09-30 13:30) [10]

Ваша ирония вполне понятна, но по сути вопроса к сожалению никто так и не высказался...

В двух словах тяжело объяснить, почему тяжело уничтожить поток естественным путем, но все же:

каждый поток реализует 4 действия:
1. idHTTP.Post
2. IcmpSendEcho
3. connect(params)
4. gethostbyaddr(params)

каждое из этих действий "замораживает" поток на определенный Timeout (необходимый для завершения текущей операции). Вот в тот момент, когда приложение необходимо закрыть, неизвестно, что в данный момент делает тот или иной поток. Потоков более 1000, их контролирует поток-мастер. Представьте, какую необходимо делать обработку для нормального завершения потоков. Более того, я не имею представления, каким образом прервать, допустим, gethostbyaddr. Если в Случае с idHTTP можно сделать idHTTP.Disconnect для моментального обрыва соединения, то как быть с gethostbyaddr? А закрывать сокеты при connect или ping?

Более того, эту обработку возможно выполнить, скажем для 1 потока. Но пока эта обработка производится, большинство других потоков уже отработали и возникает проблема определения их существования. Хорошо, поместим цикл обработки всех потоков в try..finally..end. Но для чего весь этот гемор, если винда перегружается и мне необходимо МОМЕНТАЛЬНО ОТРУБИТЬ ВСЕ ПОТОКИ без сохранения каких либо данных и т.д.?


 
Digitman   (2003-09-30 13:38) [11]

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


 
w666w   (2003-09-30 13:42) [12]

Digitman [11]

Спасибо за наводку, но я не понял, о чем речь. Вы не могли бы привести хоть какой-нить кусок кода, например для прерывания IcmpSendEcho или connect, происходящими на данный момент в потоке. Очень нужно.


 
FireHack   (2003-09-30 13:50) [13]

если у тебя W2k, то при завершении процесса его потоки уничтожаются автоматически. Но, как правильно сказал likeanangel, такое программирование - плохой пример.

естественным путем обрубить поток у меня не получается

Попробуй ждать завершение потока с помощью WaitForSinglObject, а выход из самого потока все-таки лучше реализовать.


 
Digitman   (2003-09-30 13:51) [14]


> для прерывания


да не надо ничего "прерывать" !

ты имеешь хоть малейшее понятие об асинхронных операциях ввода/вывода ? о различии асинхронных и синхронных (читай - неблокирующих и неблокирующих) операций ?


 
likeanangel   (2003-09-30 13:56) [15]

Тебе нужно сделать в каждой поточной функции вызов проверки существования некоторого объекта-флага (OpenMutex подойдет). В случае его существования выходи из поточной функции , иначе продолжай выполнение. Перед завершение приложения создай этот объект: CreateMutex(). В конце не забудь про ReleaseMutex().


 
Verg   (2003-09-30 14:40) [16]

Ага, понятно, блокирующие сокеты.

А что WSAEventSelect в Indy не применяется?

P.S. И все же, а почему был вынесен такой "диагноз" - не работает TerminateThread?


 
Verg   (2003-09-30 14:46) [17]

В одном потоке вызывается метод(процедура) из некоей библиотеки (пекета). Тот рожает еще один поток (а может и несколько), хоя ты об этом и не подозреваешь (ты же не знаешь как работают/реализованы эти компоненты (классы)) и думаешь, что работает всего один поток - твой. Ты его убиваешь при помощи TerminateThread, но при этом никто не обещал автоматического убийства и тех, "внутренних" потоков....

Пока только такие мысли...


 
Digitman   (2003-09-30 14:51) [18]

даже в случае с IcmpSendEcho(), где гнездо явно не создается, можно использовать асинхронный режим ... на то и код статуса соответствующий имеется - IO_PENDING. Т.е. всесто блокирующей операции нужно инициировать overlapped-операцию, тогда IcmpSendEcho() на время своего выполнения не будет блокировать вызвавший ее код.поток



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

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

Наверх




Память: 0.49 MB
Время: 0.01 c
1-78881
Zheks
2003-11-13 11:27
2003.11.24
Статья: Типизированные файлы на delphikingdom


1-79034
Ragazor
2003-11-13 16:11
2003.11.24
КАК перевести Pchar to string?


1-78959
lokka
2003-11-12 00:56
2003.11.24
PHP и COM


7-79209
LexaVV
2003-09-16 10:08
2003.11.24
MAC адрес, BIOS


14-79169
slivka
2003-10-31 11:28
2003.11.24
подскажите пожалуста,





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский