![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Handles и Named Pipes
Fiend © (2002-07-11 16:54:00)Такая вот проблема:
Создаю именованный канал блокирующем в режиме (с флагом PIPE_WAIT). Когда выполняю ему ConnectNamedPipe, то он соответственно не завершает выполнение этой функции, а ждёт подключения клиента. Всё это выполняется в отдельном потоке.
Возникает такая ситуация когда мне нужно закрыть канал, причём просто сделать CloseHandle не помогает, т.к. в этот момент поток с каналом застыл на операции ConnectNamedPipe, и выполнение этой операции приводит к ожиданию потоком вызывающим CloseHandle, пока не завершится ConnectNamedPipe.
В принципе я эту проблему решаю так: подключаюсь к каналу из другого потока к каналу нужного трэда, предварительно установив в потоке переменную, определяющую необходимость завершения работы потока. Всё работает нормально. Но всё же хочется услышать мнение, может есть более простой способ убить канал, а за ним и поток. Именно "убить", т.к. мне на момент этой необходимости, мне уже не важны никакие данные ни канала, ни потока.
ЧТО СКАЖЕТЕ, УВАЖАЕМЫЕ
Fiend (2002-07-11 17:35:00) [1]То Игорь Шевченко
Можно как то управлять этим процессом?
> Примерно так...У всех объектов, числящихся за процессом,
> при завершении процесса уменьшается счетчик использования.
> Если счетчик стал равен 0, то объект удаляется.
Игорь Шевченко (2002-07-11 17:27:00) [2]Fiend © (11.07.02 17:25)
> Может есть какое нибудь средство типа KillHandle(сам придумал).
Примерно так...У всех объектов, числящихся за процессом, при завершении процесса уменьшается счетчик использования. Если счетчик стал равен 0, то объект удаляется.
Fiend (2002-07-11 17:25:00) [3]а вот интересная вещь происходит:
Как же система уничтожает хэндлы на мои каналы, когда я завершаю приложение, но сам каналы за собой не закрываю.
КАК ЕЙ ЭТО УДАЁТСЯ????
Может есть какое нибудь средство типа KillHandle(сам придумал).
Игорь Шевченко (2002-07-11 17:22:00) [4]Fiend © (11.07.02 17:19)
Я работал с неблокированными и асинхронными каналами. Потому более полно ответить затрудняюсь :-(
Fiend (2002-07-11 17:19:00) [5]То Игорь Шевченко
это было бы неплохо, но дело в том что его как раз надо закрыть когда выполняется ожидание коннекта, и если выполнить настройку хэндла, то поток замирает на этой операции и ждёт видимо освобождения хэндла
Игорь Шевченко (2002-07-11 17:15:00) [6]Я бы сделал неблокированный канал...
Или SetNamedPipeHandleState для разблокировки.
Eugene Lachinov (2002-07-11 17:14:00) [7]Наверно, использовать второй параметр функции ConnectNamedPipe