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