Отображенный в памяти файл vbVerticalTab и vbNullChars появляются в результате - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь использовать Memory Mapped File (MMF) для хранения и передачи данных между приложениями.

Мне удалось создать MMF и «вроде» прочитать его.

Это мой код:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        createMMF()
        readMMF()
    End Sub

    Sub createMMF()
        Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 5)
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim writer As BinaryWriter = New BinaryWriter(stream)
        writer.Write("hello there")
    End Sub
    Sub readMMF()

        Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim streamReader = New StreamReader(stream)
        Dim text = streamReader.ReadToEnd()

        Debug.Print(text)

    End Sub

End Class

Некоторые вопросы:

1) В вызове CreateNew я указываю «5» в качестве размера, и все же, когда я изменил вызов .write с«Привет» - «Привет!», это не имело никакого значения.

2) Когда я читаю мой поток в принимающей функции, строка там, но в начале она содержит странный символ (декодированный как vbVerticalTab вконтекст отладчика) и множество vbNullChars впоследствии.

enter image description here

Я хотел бы иметь возможность передавать строки по 10Kb между процессами и точно получитьстрока без нечетного символа в начале и в конце.

1 Ответ

0 голосов
/ 20 октября 2018

Хорошо, благодаря комментариям, я смог заставить это работать.Это код для использования BinaryWriter / Reader.

   Sub createMMF()
        Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 11)
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim writer As BinaryWriter = New BinaryWriter(stream)
        writer.Write("hello there")

    End Sub
    Sub readMMF()

        Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim binaryReader = New BinaryReader(stream)
        Dim length = binaryReader.Read()  'gives 11, length of "hello there" string.
        Dim text = binaryReader.ReadChars(length)

        Debug.Print(text)

    End Sub

Кроме того, я протестировал использование пары StreamReader / Writer.Мне пришлось использовать в писателе вызов .flush (), а в методе ReadToEnd по-прежнему было добавлено много нулевых символов.

 Sub createMMF()
        Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 11)
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim writer As StreamWriter = New StreamWriter(stream)
        writer.Write("hello there")
        writer.Flush()

    End Sub
    Sub readMMF()

        Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
        Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()

        Dim streamReader = New StreamReader(stream)
        Dim text = streamReader.ReadToEnd()
        Debug.Print(text)

    End Sub

Изучив результат, вы можете увидеть символы vbNull.

enter image description here

Одна вещь, которая не имела никакого значения в моем тестировании, - это параметр Capacity метода .CreateNew.Даже если вы введете «1» в длину строки, в обоих примерах это не повлияет.Из моего чтения документов это значение байта должно быть установлено для резервирования памяти, достаточной для задачи.

...