Буферизация данных в Delphi 7 - PullRequest
1 голос
/ 10 июня 2011

Я использую: библиотеку HawkNL.

Существует процедура nlRead следующим образом:

function nlRead(socket: NLsocket; var buffer; nbytes: NLint): NLint;

Во всех примерах и других ресурсах для чтения байтов используется статический массив. Просто как то так:

FBufArray = array [0..1024] of Byte;

У меня есть несколько вопросов по этому вопросу.

  1. Какая модель / тип будет подходящей для удовлетворения функции nlRead, которую я мог бы динамически выделять место для чтения данных?

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

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

    Для меня это актуально, потому что прочитанные байты я должен отправить еще раз одновременно.

Как вообще можно читать и отправлять байты так быстро, как это возможно?

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

Если ваш вопрос о том, что передать как «буфер». Вы можете передать все что угодно. Если вы передаете указатель, вы должны разыменовать его. Например, когда вы звоните nl Read

Procedure read;
  Type
    TChunk = record
      data: pointer;
      datasize: NLint;
    End;
  Var
   Chunk: TChunk;
  Const
    IdealReadSize = 1024;
Begin
  GetMem( Chunk.data, IdealReadSize);
  Try     
    Chunk.datasize := nlRead( YourSocket, Chunk.data^, IdealReadSize );
    // Chunk.datasize hold the count of bytes which have been effectively read
    // (maybe less than 1024 in case of an error)
    // do something with your chunk
  Finally
    Freemem( Chunk.data, IdealReadSize );
  End;
End;

Это тот же подход, что и процедура TStream.Read ().

3 голосов
/ 10 июня 2011

Вы можете использовать нетипизированный указатель: var P: Pointer;, выделить с помощью GetMem или AllocMem, передать его функции с разыменовкой: nlRead(Socket, P^, Count); и освободить с помощью FreeMem.Что касается скорости, то достаточно большой статический буфер: Buf: array[0..BufSize - 1] of Byte, вероятно, лучший.

...