在delphi 7中缓冲数据

时间:2011-06-10 12:28:44

标签: delphi memory-management buffer

我正在使用:HawkNL库。

有一个nlRead程序如下:

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

在所有示例和其他资源中,使用静态数组来读取字节。 就像这样:

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

我对此事有几个问题。

  1. 哪种模型/类型适合我满足nlRead函数 为读取数据动态分配空间?

    我试图使用Pointer和GetMem或使用SetLength的动态表,但它似乎没有按预期工作。

  2. 当我必须以未知速度读取字节并尽可能快地执行时,正确的方法是什么。我的意思是例如buffor的大小应该是多少?

    对我而言,它是相关的,因为读取字节我必须同时重新发送。

  3. 一般情况下,我如何尽可能快地读取和发送字节?

2 个答案:

答案 0 :(得分:4)

如果你的问题是作为'缓冲'传递什么。你可以传递任何你喜欢的东西。 如果你传递一个指针,你必须取消引用它。例如,当您调用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()过程的方法相同。

答案 1 :(得分:3)

您可以使用无类型指针:var P: Pointer;,使用GetMemAllocMem进行分配,将其传递给已解除引用的函数nlRead(Socket, P^, Count);并使用FreeMem取消分配。 关于速度,静态缓冲区足够大:Buf: array[0..BufSize - 1] of Byte可能是最好的。