![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки
Vitek © (2003-03-15 00:47:00)Создаю поток/нить : CreateThread(...);
Процедура чёто там выполняет ... а именно копируется блок данных по сети , причём немаленьки :) те уходит на копирование приличное время, поток подвисает ... и когда приложения пытаются закрыть вылазит страшная ошибка :) Посоветуйте как прибить поток, а то приходится ждать когда он там свои дела доделает...
Александр Спелицин (2003-03-20 12:25:00) [1]Если поток действительно что-то делает, то пусть он перед каждым элементарным действием проверяет какой-либо флаг, пусть даже Terminated.
А вот если чего-то ждет то тут немного посложнее. Сделать все операции асинхронными. А их состояние анализировать по состоянию объекта "Событие" (Event) из структуры OVERLAPPED. Только вместо WaitForSingleObject использовать WaitForMultipleObjects. И передавать в нее массив из 2-х описателей: 1-й - это Событие из из структуры OVERLAPPED, а второй - это тоже Событие, но созданное Вами. Вы измените его состояние в "Установлен" (Signaled), если нужно завершить поток.
Далее справка по WaitForMultipleObjects в MSDN.
Хороший пример на эту тему есть в примерах MSDN. Найдите файлы simple.c, service.c. Посмотрите, как там орнанизована работы с именоваными каналами.
Alex Konshin (2003-03-15 11:37:00) [2]Во-первых, почитай help про BeginThread/EndThread.
А по существу вопроса: как копируешь, как ждешь (и внутри потока, и сам поток)? Ты же ничего не сказал.
TerminateThread - это уж на крайний случай, постарайся обойтись без него.
theodor_iv (2003-03-15 08:57:00) [3]TerminateThread, но это только в крайнем случае. Лучше поискать более корректное решение проблемы. Например, создать переменную-флажок, которую вызывающий поток будет устанавливать, когда необходимо завершить работу, а вызываемый -- периодически проверять.