1 Star 0 Fork 0

JonK/cheat-engine

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
circularBuffer.pas 2.18 KB
一键复制 编辑 原始数据 按行查看 历史
cheat-engine 提交于 2019-12-20 00:49 +08:00 . Fix registry issues
unit circularBuffer;
{$MODE Delphi}
{
Circular buffer for only 1 writer and 1 reader thread
Do not use with multiple writers or multiple readers (or at least protect the read and write yourself then)
}
interface
uses
{$ifdef darwin}macport,{$endif}
{$ifdef windows}windows,{$endif}
LCLIntf, syncobjs,classes, sysutils;
type TCircularObjectBuffer=class
private
buffer: array of TObject;
ReadIndex: integer;
WriteIndex: integer;
maxTimeout: integer;
hasData: Tevent;
hasSpace: TEvent;
function getCount: integer;
public
function Write(o: TObject): boolean;
function Read: TObject;
constructor create(InitialSize, maxTimeout: integer);
destructor destroy; override;
property count: integer read getCount;
end;
implementation
constructor TCircularObjectBuffer.create(InitialSize, maxTimeout: integer);
begin
setlength(buffer,initialsize);
ReadIndex:=0;
WriteIndex:=0;
HasData:=Tevent.create(nil,false,false,'');
HasSpace:=Tevent.create(nil,false,true,'');
self.maxTimeout:=MaxTimeout;
end;
destructor TCircularObjectBuffer.destroy;
begin
setlength(buffer,0);
if HasData<>nil then
HasData.Free;
if HasSpace<>nil then
HasSpace.Free;
end;
function TCircularObjectBuffer.getCount: integer;
begin
if ReadIndex=WriteIndex then
result:=0
else
if ReadIndex<WriteIndex then
result:=WriteIndex-ReadIndex
else
result:=(length(buffer)-ReadIndex)+WriteIndex;
end;
function TCircularObjectBuffer.Write(o: TObject): boolean;
var nextwriteindex: integer;
begin
result:=false;
nextwriteindex:=(WriteIndex+1) mod length(buffer);
if (nextwriteindex=ReadIndex) then
begin
//buffer full
sleep(5000);
if (hasspace.WaitFor(maxTimeout)<>wrsignaled) then exit;
end;
buffer[WriteIndex]:=o;
writeindex:=nextwriteindex;
HasData.SetEvent;
result:=true;
end;
function TCircularObjectBuffer.Read: TObject;
begin
result:=nil;
if (readindex=writeindex) and (hasdata.WaitFor(MaxTimeout)<>wrSignaled) then exit;
result:=Buffer[ReadIndex];
ReadIndex:=(readindex+1) mod length(buffer);
HasSpace.SetEvent;
end;
end.
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/JonDO/cheat-engine.git
git@gitee.com:JonDO/cheat-engine.git
JonDO
cheat-engine
cheat-engine
master

搜索帮助