| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > CreateThread VS CloseHandle |
| Автор: Nuzur 21.2.2006, 14:13 | ||
Что быдет в результате такого действия:
Где pAnalisator - указатель на клас. Тоесть, что будет с потоком, если он завершен\незавершен? |
| Автор: Nuzur 21.2.2006, 15:17 |
| Дело все в том что CloseHandle(hMonitorThread) возвращяет 1-цу, что как я понимаю, должно закрыть пток, ну тоесть убить его, но он продолжает свою работу. |
| Автор: Fin 21.2.2006, 16:39 |
| Счетчик у потока выставляется на 2. Когда со стороны вызова ты закрываеш поток, ты просто уменьшаеш счетчик. Пока счетчик не станет равным нулю, поток не будет закрыт. Более подробно книга Дж. Рихтера "Виндовс - для проффессионалов" |
| Автор: Nuzur 21.2.2006, 16:49 |
| А как уменьшиьт то его? ТОесть функция CloseHandle не закрывает поток? Ничего не понимаю, можна подробней? А то книги у меня нет, да и пока я там найду все позеленеет |
| Автор: Fin 21.2.2006, 17:06 |
| Каждый объект ядра имеет свой счетчик ссылок на данный объект. Когда ты делаеш CloseHandle, ты уменьшаеш счетчик на единицу. И если счетчик станет нулем, винда уничтожает данный объект автоматически. В книге ничего искать не надо, там целая глава посвяшена только потокам. И книга из разряда Must Have. Чтобы убить поток, сушествует команда TerminateThread. |
| Автор: Nuzur 21.2.2006, 17:15 | ||
Самое смешное что даже TerminateThread не работает:
|
| Автор: Fin 21.2.2006, 17:20 | ||
| А оно у тебя и не должно работать. Ты же в начале убил ссылку, а затем уже пытаешся убить поток. Поставь команды наоборот, и должно работать.
|
| Автор: Nuzur 21.2.2006, 17:27 |
| Угу, сработало. Но суть не втом, тоесть поток пордолжает свое существование после CloseHandle и до какого момента? |
| Автор: Fin 21.2.2006, 17:36 |
| Пока кто либо не завершит поток (TerminateThread) или пока поток не вызовет ExitThread или пока функция потока не будет завершена return. Последний вариант предпочтительней. |
| Автор: Nuzur 21.2.2006, 17:43 |
| А зачем в таком случае вАще нужен CloseHandle?!?! Я уже совсем не понимаю его надобность |
| Автор: Fin 21.2.2006, 17:56 |
| Ты в программе получил ссылку на объект ядра. Даже если поток уже не работает, объект ядра остается в памяти. Ты сможеш узнать код завершения и состояние потока. Как только необходимость в этом отпадет, ты должен закрыть ссылку (что собственно и делает CloseHandle). Иначе объект ядра так и останется висеть в памяти, до завершения процесса, вызвавшего данный объект. В маленьких (учебных) программах это не страшно, но в больших может привести к непонятным глюкам. Которые очень трудно отлавливать. Добавлено @ 17:59 Я например всегда стараюсь в работе придерживаться правила "То что открыл, сразу пиши код на закрытие. Иначе потом забудеш" |
| Автор: Earnest 21.2.2006, 19:54 |
| Nuzur, закрывать поток ф-й TerminateThread можно только в аварийном случае (например, если поток завис\зациклился или в deadlock попал). TerminateThread - это вроде как маникюр топором делать. Поток нормально завершается только изнутри - путем нормального завершения функции потока. Если нужно предусмотреть способ завершения потока извне, заведи событие и проверяй его в функции потока. |
| Автор: Nuzur 22.2.2006, 13:23 | ||
Да все это ясно, посто занимаюсь "поддержкой" кода который уже написан и менять его нельзя, а посему пытаюсь понять логику тех кто его писал. |