{建议在多线程中使用或共享缓冲区使用如果不加临界区,TobjectQueue在多线程访问中,
如果count=0时,调用pop会出现异常 }
TObjectCriticalSectionQueue = class(TObjectQueue)
private
FCriticalSection: TRTLCriticalSection;
public
function Push(AObject: TObject): TObject;
function Pop: TObject;
function Peek: TObject;
constructor Create;
destructor Destroy; override;
end;
constructor TObjectCriticalSectionQueue.Create;
begin
inherited Create;
InitializeCriticalSection( FCriticalSection);
end;
destructor TObjectCriticalSectionQueue.Destroy;
begin
DeleteCriticalSection( FCriticalSection);
inherited;
end;
function TObjectCriticalSectionQueue.Peek: TObject;
begin
try
EnterCriticalSection(FCriticalSection);
Result := inherited Peek;
finally
LeaveCriticalSection(FCriticalSection);
end;
end;
function TObjectCriticalSectionQueue.Pop: TObject;
begin
try
EnterCriticalSection(FCriticalSection);
Result := inherited Pop;
finally
LeaveCriticalSection(FCriticalSection);
end;
end;
function TObjectCriticalSectionQueue.Push(AObject: TObject): TObject;
begin
try
EnterCriticalSection(FCriticalSection);
Result := inherited Push(AObject);
finally
LeaveCriticalSection(FCriticalSection);
end;
end;