我正在处理FIFO队列(简单的,先进先出),但是数据大小可变,我对自己的设计方式不太确定。我将存储的数据类型事先知道,并且假设每个该类的实例将是相同的。我在考虑使用TList,其中将存储以下定义的记录(@David - 这是针对D2007的,因此我没有Generics.Collections可用 :)
type
PListItem = ^TListItem;
TListItem = record
Size: Integer; // size of the data pointed by the following member
Data: Pointer; // pointer to the target data reserved in memory
end;
使用如下实现方式(这里假设一切正常,未使用异常处理):
type
TListQueue = class
private
FList: TList;
public
constructor Create;
destructor Destroy; override;
procedure Clear;
procedure Push(const Value; const Size: Integer);
procedure Pop(var Value; var Size: Integer);
end;
constructor TListQueue.Create;
begin
inherited;
FList := TList.Create;
end;
destructor TListQueue.Destroy;
begin
Clear;
FList.Free;
inherited;
end;
procedure TListQueue.Push(const Value; const Size: Integer);
var ListItem: PListItem;
begin
New(ListItem);
ListItem.Size := Size;
ListItem.Data := AllocMem(Size);
Move(Value, ListItem.Data^, Size);
FList.Add(ListItem);
end;
procedure TListQueue.Pop(var Value; var Size: Integer);
var ListItem: PListItem;
begin
if FList.Count > 0 then
begin
ListItem := FList.Items[0];
Size := ListItem^.Size;
Move(ListItem.Data^, Value, ListItem.Size);
FreeMem(ListItem.Data, ListItem.Size);
Dispose(ListItem);
FList.Delete(0);
end;
end;
procedure TListQueue.Clear;
var I: Integer;
ListItem: PListItem;
begin
for I := 0 to FList.Count - 1 do
begin
ListItem := FList.Items[I];
FreeMem(ListItem.Data, ListItem.Size);
Dispose(ListItem);
end;
FList.Clear;
end;
我的问题是:
这是否是制作FIFO队列的有效方法(用于字符串、流、记录等数据类型),其大小从几个字节到大约1MB(在流的情况下)?
非常感谢。
New(Listitem);
而不是ListItem := AllocMem(SizeOf(TListItem));
,在我看来更加“简洁”... - ainNew(Listitem);
,我忘记提到了我会知道输入和输出的数据类型。我将有几个队列,每个队列只处理一种数据类型。无论如何,这可能会保存到 TListItem 中。 - user532231Dispose()
以释放使用New
分配的内存。 - ainDispose
,我现在正在编辑问题。关于第三方库,我认为这种东西不是必要的。现在我终于将流传递到了这个队列,当然,在将其传递给Push
之前,您必须设置流的SetSize
,因此我还将创建一些数据大小获取器。 - user532231