Для простоты, это ситуация, когда NamedPipe SERVER ожидает, когда клиент NamedPipe выполнит запись в канал (используя WriteFile ())
Windows API, который блокирует, является ReadFile ()
Сервер создал синхронный канал (без перекрывающихся операций ввода-вывода) с включенной блокировкой
Клиент подключился, и теперь сервер ожидает некоторые данные.
В обычном порядке клиент отправляет некоторые данные, а сервер обрабатывает их, а затем возвращается в ReadFile () для ожидания следующего фрагмента данных.
Между тем происходит событие (например, пользовательский ввод), и СЕРВЕР NamedPipe должен теперь выполнить какой-то другой код, который он не может сделать, пока ReadFile () блокирует.
На данный момент я должен отметить, что Клиент NamedPipe не является моим приложением, поэтому я не могу его контролировать. Я не могу заставить его отправить несколько байтов, чтобы разблокировать сервер. Он просто собирается сидеть и не отправлять данные. Поскольку у меня нет контроля над реализацией клиента, я ничего не могу изменить в этом отношении.
Одним из решений было бы создание отдельного потока, в котором выполняются все операции ReadFile (). Таким образом, когда происходит событие, я могу просто обработать код. Проблема в том, что для события также требуется отдельный поток, поэтому теперь у меня есть два дополнительных потока для каждого экземпляра этого сервера. Поскольку это должно быть масштабируемым, это нежелательно.
Из другого потока я пытался позвонить
DisconnectNamedPipe()
и
CloseHandle()
они оба не вернутся (пока клиент не запишет в канал.)
Я не могу подключиться к одному каналу и записать несколько байтов, потому что:
"Все экземпляры именованного канала совместно используют одно и то же имя канала, но каждый экземпляр имеет
свои собственные буферы и дескрипторы, и обеспечивает отдельный канал для клиента / сервера
связь. "
http://msdn.microsoft.com/en-us/library/aa365590.aspx
Мне нужен способ подделать его, так что вопрос в $ 64 тыс.:
Как я могу снять блокировку ReadFile ()?