2013-02-18 2 views
0

Я пишу приложение win32, которое использует namedpipe для межпроцессного общения. Когда один процесс пытается записатьFile, он напишет структуру (сообщите другому процессу, сколько байтов и другую информацию), затем он напишет фактические данные, снова позвонив в WriteFile.Namedpipe writeFIle вопросы Win32

Другой процесс, когда он читает, считывает первый msg, а затем читает второй msg на основе информации, полученной от первого сообщения.

Мои вопросы:

  1. Если серверный процесс записывает данные, но процесс клиента не читал еще, возможно к потере первого сообщ, когда клиент читает? Например, когда сервер вызывает WriteFile во второй раз для записи фактических данных, будет ли перезаписан предыдущий msg?

  2. Есть ли лучшее решение для использования waitforsingleobject для синхронизации?

Благодаря

ответ

3

труба немного как настоящая труба - когда вы пишете больше к трубе, он не переписывает то, что уже было в трубе. Он просто добавляет больше данных в канал, который будет доставлен после данных, которые вы ранее писали в трубе.

Редко найти WaitForSingleObject Полезно для трубы. Если вы хотите заблокировать текущий поток, пока он не получит данные из канала, вы можете просто выполнить синхронное чтение, и оно будет блокироваться до тех пор, пока не будут данные. Если вы хотите заблокировать до тех пор, пока не поступит какой-либо из нескольких источников, вы обычно хотите WaitForMultipleObjects или MsgWaitForMultipleObjects, поэтому ваш поток будет запускаться, когда любой из источников будет иметь вход для процесса.

Единственное, что я могу вспомнить, используя WaitForSingleObject на трубе, было с нулевым таймаутом, поэтому приемник продолжал бы другую обработку, если бы не было входа в трубу, и каждый раз в то время проверяют, имеет ли канал какие-либо данные для обработки , Хотя изначально это похоже на то, что PeekNamedPipe будет работать для этого, он действительно очень полезен для других целей - хотя он может сработать для вас, прочитать данные заголовка и выяснить, какой другой код вызывать для чтения и обработки всего сообщения.

Сказав все это, я чувствую себя обязанным указать, что я не писал никакого нового кода с использованием именованных каналов в течение долгого времени. Я могу думать о очень немногих ситуациях, в которых я даже считаю их сегодня - я почти всегда использовал сокеты вместо этого.

+0

Благодарим вас за ответ. – lzbob