![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: 3 Всего: 6 |
Столкнулся с такой проблемой: в отдельном потоке создаётся серверный именованный канал (ИК), копия его handle передаётся основному потоку. Если с этим ИК установлено соединение, из основного потока его невозможно закрыть. Есть-ли возможность принудительного закрытия такого ИК, кроме как уничтожить его поток?
|
|||
|
||||
NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 6 Всего: 23 |
EnergoHokum, чтение и запись в канал в том потоке осуществляются в цикле, как я понял? Можно завести Stop Event, и проверять его состояние при каждой итерации. Если состояние Signaled, то закрываем канал. В другом потоке, когда нужно закрыть канал, просто вызывать SetEvent.
А просто DisconnectNamedPipe и CloseHandle не помогают? |
|||
|
||||
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: 3 Всего: 6 |
Я использую блокирующие функции создания канала и чтения из него. При их использовании DisconnectNamedPipe и CloseHandle не помогают, вешаются. Более того, ProcessExplorer при попытке закрыть handle ожидающего канала тоже впадает в кому. Решения видится пока два: или использовать асинхронные функции, или перейти на сокеты (попробую, может там нет такой засады).
Насчёт асинхронного чтения/записи вот что подумалось: ведь если клиент передаст часть данных и, например, повиснет, не отпустив канал, приходим к тому-же корыту -- handle канала с серверной стороны не удастся закрыть, и до события выхода поток не доберётся. Так что получается, выход -- только TerminateThread? Это сообщение отредактировал(а) EnergoHokum - 3.6.2008, 13:47 |
|||
|
||||
NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 6 Всего: 23 |
Решение перехода на сокеты вполне разумно. Во-первых, переносимо, во-вторых, с ними работать проще, в третьих, больше возможностей. Если клиент отрубится, recv на сервере сразу вернёт управление.
Добавлено через 50 секунд Пайпы лучше, если нужно установить право доступа средствами NT. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |