📄 buffer.pas
字号:
var
i: integer;
begin
if HaveBuffer = false then
begin
result := 0;
end
else
begin
result := 0;
for i := 1 to high(Buffers) do
begin
if Buffers[i].IsUsed = 1 then
begin
inc(result);
end;
end;
if result = 0 then
begin
HaveBuffer := false;
if high(Buffers) > 999 then
begin
//这个Lock函数获得锁以后,其他线程将不能再获得这个锁,直到当前线程释放这个锁
lock;
try
setlength(Buffers, 1000);
finally
unlock;
end;
end;
end;
end;
end;
constructor TBaseMocmppBufferObj.Create;
begin
inherited;
setlength(Buffers, 1000);
end;
procedure TBaseMocmppBufferObj.Delete(i: integer);
begin
if (i <= high(Buffers)) and (i >= 1) then
begin
lock;
try
Buffers[i].IsUsed := 0;
finally
unlock;
end;
end;
end;
destructor TBaseMocmppBufferObj.destroy;
begin
Buffers := nil;
inherited;
end;
procedure TBaseMocmppBufferObj.LoadFromFile(FileName: string;
BlockSize: integer);
var
Filestream: Tfilestream;
i: integer;
begin
if FileExists(FileName) then
begin
Filestream := Tfilestream.Create(FileName, fmOpenRead);
try
try
i := Filestream.Size div BlockSize;
if i > high(Buffers) then
begin
setlength(Buffers, i + 1);
end;
for i := 1 to high(Buffers) do
begin
if Filestream.Position < Filestream.Size then
begin
Filestream.ReadBuffer(Buffers[i], BlockSize);
end
else
begin
break;
end;
end;
except
on e: exception do
begin
for i := 1 to high(Buffers) do
begin
ZeroMemory(@Buffers[i], BlockSize);
end;
end;
end;
finally
Filestream.Free;
end;
end;
end;
function TBaseMocmppBufferObj.Read(i: integer): TMocmppBuffer;
begin
result := Buffers[i];
end;
procedure TBaseMocmppBufferObj.SaveToFile(FileName: string;
BlockSize: integer);
var
Filestream: Tfilestream;
i: integer;
begin
Filestream := Tfilestream.Create(FileName, fmCreate);
try
for i := 1 to high(Buffers) do
begin
if Buffers[i].IsUsed = 1 then
begin
Filestream.WriteBuffer(Buffers[i], BlockSize);
end;
end;
finally
Filestream.Free;
end;
end;
{ TMtCmppLogBufferObj }
function TMtCmppLogBufferObj.Add(Buffer: TMtBuffer): boolean;
var
i: integer;
begin
result := false;
for i := WriteCursor to high(Buffers) do
begin
if Buffers[i].IsUsed = 0 then
begin
lock;
try
ZeroMemory(@Buffers[i], sizeof(TMtBuffer));
Buffers[i] := Buffer;
Buffers[i].IsUsed := 1;
finally
unlock;
end;
WriteCursor := i + 1;
if WriteCursor > high(Buffers) then WriteCursor := 1;
HaveBuffer := True;
result := True;
break;
end;
end;
if result = false then
begin
for i := 1 to high(Buffers) do
begin
if Buffers[i].IsUsed = 0 then
begin
lock;
try
ZeroMemory(@Buffers[i], sizeof(TMtBuffer));
Buffers[i] := Buffer;
Buffers[i].IsUsed := 1;
finally
unlock;
end;
WriteCursor := i + 1;
if WriteCursor > high(Buffers) then WriteCursor := 1;
HaveBuffer := True;
result := True;
break;
end;
end;
end;
if result = false then
begin
lock;
try
setlength(Buffers, high(Buffers) + 1 + 1000); //加大缓冲
finally
unlock;
end;
WriteCursor := high(Buffers) + 1; //往前挪一位
result := Add(Buffer);
end;
end;
procedure TMtCmppLogBufferObj.BakBuffer;
begin
SaveToFile('MtCmppLogBuffers.bin', sizeof(TMtBuffer));
end;
constructor TMtCmppLogBufferObj.Create;
begin
inherited;
LoadFromFile('MtCmppLogBuffers.bin', sizeof(TMtBuffer));
end;
destructor TMtCmppLogBufferObj.destroy;
begin
SaveToFile('MtCmppLogBuffers.bin', sizeof(TMtBuffer));
inherited;
end;
function TMtCmppLogBufferObj.Get: integer;
var
i: integer;
begin
if HaveBuffer = false then
begin
result := 0;
end
else
begin
result := 0;
for i := ReadCursor to high(Buffers) do
begin
if Buffers[i].IsUsed = 1 then
begin
result := i;
ReadCursor := i + 1;
if ReadCursor > high(Buffers) then ReadCursor := 1;
break;
end;
end;
if result = 0 then
begin
for i := 1 to high(Buffers) do
begin
if Buffers[i].IsUsed = 1 then
begin
result := i;
ReadCursor := i + 1;
if ReadCursor > high(Buffers) then ReadCursor := 1;
break;
end;
end;
end;
end;
end;
{ TMoLogcmppBufferObj }
function TMoLogcmppBufferObj.Add(Buffer: TMocmppBuffer): boolean;
var
i: integer;
begin
result := false;
for i := WriteCursor to high(Buffers) do
begin
if Buffers[i].IsUsed = 0 then
begin
lock;
try
ZeroMemory(@Buffers[i], sizeof(TMocmppBuffer));
Buffers[i] := Buffer;
Buffers[i].IsUsed := 1;
finally
unlock;
end;
WriteCursor := i + 1;
if WriteCursor > high(Buffers) then WriteCursor := 1;
HaveBuffer := True;
result := True;
break;
end;
end;
if result = false then
begin
for i := 1 to high(Buffers) do
begin
if Buffers[i].IsUsed = 0 then
begin
lock;
try
ZeroMemory(@Buffers[i], sizeof(TMocmppBuffer));
Buffers[i] := Buffer;
Buffers[i].IsUsed := 1;
finally
unlock;
end;
WriteCursor := i + 1;
if WriteCursor > high(Buffers) then WriteCursor := 1;
HaveBuffer := True;
result := True;
break;
end;
end;
end;
if result = false then
begin
lock;
try
setlength(Buffers, high(Buffers) + 1 + 1000); //加大缓冲
finally
unlock;
end;
WriteCursor := high(Buffers) + 1; //往前挪一位
result := Add(Buffer);
end;
end;
procedure TMoLogcmppBufferObj.BakBuffer;
begin
SaveToFile('MoLogcmppBuffers.bin', sizeof(TMocmppBuffer));
end;
constructor TMoLogcmppBufferObj.Create;
begin
inherited;
LoadFromFile('MoLogcmppBuffers.bin', sizeof(TMocmppBuffer));
end;
destructor TMoLogcmppBufferObj.destroy;
begin
SaveToFile('MoLogcmppBuffers.bin', sizeof(TMocmppBuffer));
inherited;
end;
function TMoLogcmppBufferObj.Get: integer;
var
i: integer;
begin
if HaveBuffer = false then
begin
result := 0;
end
else
begin
result := 0;
for i := ReadCursor to high(Buffers) do
begin
if Buffers[i].IsUsed = 1 then
begin
result := i;
ReadCursor := i + 1;
if ReadCursor > high(Buffers) then ReadCursor := 1;
break;
end;
end;
if result = 0 then
begin
for i := 1 to high(Buffers) do
begin
if Buffers[i].IsUsed = 1 then
begin
result := i;
ReadCursor := i + 1;
if ReadCursor > high(Buffers) then ReadCursor := 1;
break;
end;
end;
end;
end;
end;
{ TMocmppBufferObj }
function TMocmppBufferObj.Add(pac: TCMPP20_PACKET): boolean;
var
i: integer;
begin
result := false;
for i := WriteCursor to high(Buffers) do
begin
if Buffers[i].IsUsed = 0 then
begin
lock;
try
ZeroMemory(@Buffers[i], sizeof(TCMPP20_PACKET));
Buffers[i].mo := pac.MsgBody.CMPP_DELIVER;
GetMsgId(Buffers[i].MoInMsgId);
Buffers[i].RecTime := now();
Buffers[i].IsUsed := 1;
finally
unlock;
end;
WriteCursor := i + 1;
if WriteCursor > high(Buffers) then WriteCursor := 1;
HaveBuffer := True;
result := True;
break;
end;
end;
if result = false then
begin
for i := 1 to high(Buffers) do
begin
if Buffers[i].IsUsed = 0 then
begin
lock;
try
ZeroMemory(@Buffers[i], sizeof(TMoBuffer));
Buffers[i].mo := pac.MsgBody.CMPP_DELIVER;
GetMsgId(Buffers[i].MoInMsgId);
Buffers[i].RecTime := now();
Buffers[i].IsUsed := 1;
finally
unlock;
end;
WriteCursor := i + 1;
if WriteCursor > high(Buffers) then WriteCursor := 1;
HaveBuffer := True;
result := True;
break;
end;
end;
end;
if result = false then
begin
lock;
try
setlength(Buffers, high(Buffers) + 1 + 1000); //加大缓冲
finally
unlock;
end;
WriteCursor := high(Buffers) + 1; //往前挪一位
result := Add(pac);
end;
end;
procedure TMocmppBufferObj.BakBuffer;
begin
SaveToFile('MocmppBuffers.bin', sizeof(TMocmppBuffer));
LogBuffers.BakBuffer;
end;
constructor TMocmppBufferObj.Create;
begin
inherited;
Seqid := 1;
LogBuffers := TMoLogcmppBufferObj.Create;
LoadFromFile('MocmppBuffers.bin', sizeof(TMocmppBuffer));
end;
procedure TMocmppBufferObj.DelExpired;
var
i: integer;
begin
for i := 1 to high(Buffers) do
begin
if Buffers[i].IsUsed = 1 then
begin
if (Buffers[i].PrcTimes >= 1) and (now() - Buffers[i].LastPrcTime > 10 / 60 / 24) then
begin
//处理次数达到1次或以上,且最后发送后,10分钟都没应答
LogBuffers.Add(Buffers[i]);
Delete(i);
end;
end;
end;
end;
destructor TMocmppBufferObj.destroy;
begin
SaveToFile('MocmppBuffers.bin', sizeof(TMocmppBuffer));
freeandnil(LogBuffers);
inherited;
end;
function TMocmppBufferObj.Get: integer;
var
i: integer;
begin
if HaveBuffer = false then
begin
result := 0;
end
else
begin
result := 0;
for i := ReadCursor to high(Buffers) do
begin
if (Buffers[i].IsUsed = 1) and (Buffers[i].Prced = 0) then
begin
if Buffers[i].PrcTimes = 0 then
begin
result := i;
ReadCursor := i + 1;
if ReadCursor > high(Buffers) then ReadCursor := 1;
break;
end;
end;
end;
if result = 0 then
begin
for i := 1 to high(Buffers) do
begin
if (Buffers[i].IsUsed = 1) and (Buffers[i].Prced = 0) then
begin
if Buffers[i].PrcTimes = 0 then
begin
result := i;
ReadCursor := i + 1;
if ReadCursor > high(Buffers) then ReadCursor := 1;
break;
end;
end;
end;
end;
end;
end;
procedure TMocmppBufferObj.GetMsgId(var InMsgId: array of char);
var
s: string;
i: integer;
begin
//GateId是以1开头的1XXX的四位数字,1说明是通信网关
s := copy(inttostr(GSMSCENTERCONFIG.GateId), 2, 3);
if length(s) = 1 then s := '00' + s;
if length(s) = 2 then s := '0' + s;
s := s + FormatDatetime('yyyymmddhhnnss', now);
i := GetSeqid;
if i >= 100 then
s := s + inttostr(i)
else if i >= 10 then
s := s + '0' + inttostr(i)
else
s := s + '00' + inttostr(i);
HexToChar(s, InMsgId);
end;
function TMocmppBufferObj.GetSeqid: Cardinal;
begin
//1-999
result := Seqid;
inc(Seqid);
if Seqid >= 10
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -