2016-12-19 3 views
-4

Используя пример MSDN по Creating Named Shared Memory, у меня есть несколько вопросов (примечание: имена переменного рядные которые упоминаются в примере процесса 1 в гиперссылка):Создание именованных Общих файлов память для передачи больших объемов данных

  • было бы возможно для копирования сообщений большой длины (т.е. szMsg.length()> 4000) в буфер (pBuf) в процессе 1?

  • Каков максимальный размер буфера (BUF_SIZE), разрешенный для создания объекта сопоставления файлов?

  • Если да, то какова связь между размером буфера, используемого для создания объекта отображения против длины сообщения. (Т.е. .. В примере, BUF_SIZE против szMsg)

Я задаю эти вопросы потому что, когда я пытаюсь скопировать сообщения длиной> 4000, он терпит неудачу с ошибками нарушения прав доступа, несмотря на увеличение buf_size с 512 до 1024 или даже выше.

Я новичок в кодировании. Пожалуйста, объясните мне, как создать объект сопоставления файлов, который мог бы размещать сообщения большой длины.

+0

Да, возможно использовать файлы с отображением памяти размером 4000 байт. На самом деле это вовсе не огромно. Если вы можете сделать это за один байт, вы можете сделать это за 4000, просто увеличив размер. Это тривиально. Ваш код, безусловно, неисправен каким-то образом. Знают ли, что 1024 меньше 4000? Вы цените, что буфер должен быть как минимум таким же большим, как и его содержимое? Почему вы все равно используете картографирование памяти. –

+0

@DavidHeffernan, я понимаю, что 4000> 1024. Но я заметил, что размер этого буфера не прямо пропорционален длине сообщения. Даже если я ставлю размер буфера как 8, и я смог бы успешно скопировать сообщение до длины ~ 4000. – user3852447

+0

@DavidHeffernan: Я могу отправить некоторые данные, которые обрабатываются в основном потоке, на другой параллельный процесс. – user3852447

ответ

1

Если вы пишете более чем BUF_SIZE байт, Windows не гарантирует, что произойдет. На практике, однако, сопоставление файлов будет округлено до страницы с памятью (которая составляет 4096). Таким образом, если вы укажете «маленькое» значение для BUF_SIZE, вы получите сообщения до и до 4096 байт, но если вы напишете 4097 байт, вы получите , вероятно, (*) получите нарушение доступа.

*: Если вам не повезло, следующая страница уже будет отображена в процесс, и вы перезапишете другую критическую информацию.

Решение: вы должны установить BUF_SIZE как минимум как самое большое сообщение, которое вы хотите отправить.

Что такое соотношение между размером буфера, используемого для создания отображения объекта против длины сообщения (т.е. .. В примере, BUF_SIZE против szMsg)

A:. BUFSIZE должно быть больше чем или равно szMsg.

+0

@DavidHeffernan: Отличная точка! –

+0

@MartinBonner. Thanq очень подходит для вашего ответа. Но в моем коде я получаю сообщение длиной 6200 байт. Я сохранил буфер размером 8192. Даже тогда это не удалось. Какие могут быть другие вероятности неудачи. – user3852447

+0

@MartinBonner: Каков максимальный размер страницы памяти (размер буфера)? ЕСЛИ он превышает то, как его следует обрабатывать? В течение некоторого времени разделим строку длиной 4000 и создаем несколько объектов файла карты. – user3852447

Смежные вопросы