我编写了一个IC卡地磅称重的软件,其中有一个单独的服务是在称的仪表中取数和检测是否有卡在刷。我通过一个定时器来不断的对仪表传统送过来的数据进行分析。并显示在窗体上,然后我又弄了一个定时器。每隔一秒钟检测一下有没有刷卡。如果有卡在刷,那就执行刷卡的操作。上面的功能我都通过定时器来实现了。数据也很准确。但是程序在运行一段时间后就会自动退出。后来我分析了一下内存。原来内存在不段的增长,当长到一定的程序时程序就会自动的退出了。请问我应该怎么样改呢。才能让内存不再这样增长。在定时器中定义的变量是这样的。帮我看一下为什么内存增长会那么快吧。谢谢啦。代码:
procedure Tform_bangcheng.Timer2Timer(Sender: TObject);
var
i:integer;
DataByte:array[0..CACHE] of Byte;
nBytesRead:LongWORD ;
dwError:LongWORD ;
cs:TCOMSTAT;
gBufferLength: integer;
sCurrentContent : string;
iCurrentContent : integer;begin
........
end;procedure Tform_bangcheng.Timer4Timer(Sender: TObject);
var
byteCardType : pbyte;
intStatues : integer ;
begin
intStatues:=DC_AutoTestCard(byteCardType); //判断卡是否存在。=0:存在 否则不存在;
.....
END;
procedure Tform_bangcheng.Timer2Timer(Sender: TObject);
var
i:integer;
DataByte:array[0..CACHE] of Byte;
nBytesRead:LongWORD ;
dwError:LongWORD ;
cs:TCOMSTAT;
gBufferLength: integer;
sCurrentContent : string;
iCurrentContent : integer;begin
........
end;procedure Tform_bangcheng.Timer4Timer(Sender: TObject);
var
byteCardType : pbyte;
intStatues : integer ;
begin
intStatues:=DC_AutoTestCard(byteCardType); //判断卡是否存在。=0:存在 否则不存在;
.....
END;
解决方案 »
- 怎样在程序运行中获得当前页面的页面属性?
- 求助,DELPHI PANEL条件变色!
- adoquery无法使用select top语句吗?
- 用Idsmtp 发送邮件,怎么对方显示成垃圾邮件,怎么搞的,那位大侠知道?谢谢!
- 俺是个傻子,俺在等Delphi8,俺失望了,俺从今天开始学C#
- 关于网络路径映射为物理路径问题:
- 怎么样使edit1在输入字符时显示‘********’?
- 关于全局变量的声明问题?!
- 如何使用SetWindowsHookExW 和 CallNextHookEx
- 超级菜鸟问题,怎样让delphi的背景不是空的(居然能看见桌面??)?
- [[[[[散分.........谁都可以接]]]]]]
- IC卡刷卡操作
1。立即返回型?2。无限时间等待条件到达后返回?3。有限时间等待条件后返回?
如果这个过程运行非常耗时间,可能导致函数重入。上次运行还没有结束,下一个事件又引发了。
函数的重入问题解决起来麻烦,不过不清楚你的问题是不是这方面的问题。
定义器触发时间是250ms.
仪表每次发送18个字节。能不能帮我分析一下哪个地方有问题吗。procedure Tform_bangcheng.Timer2Timer(Sender: TObject);
var
i:integer;
DataByte:array[0..HUANCHONGQU] of Byte;
nBytesRead:LongWORD ;
dwError:LongWORD ;
cs:TCOMSTAT;
gBufferLength: integer;
sCurrentContent : string;
iCurrentContent : integer;begin
try
ClearCommError(hComm,dwError,@CS); //取得状态
if cs.cbInQue =0 then
begin
//edt_zl.Text :='000000';
//lblStatus.Caption:='仪表未发送' ;
exit; //缓冲区为空,则退出
end;
ReadFile(hComm, DataByte,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据 for i:=0 to nBytesRead-1 do
begin
g.Buffer[g.BufferIndexTail] :=DataByte[i];
g.BufferIndexTail:=g.BufferIndexTail+1;
if g.BufferIndexTail >HUANCHONGQU then g.BufferIndexTail:=0; // care of overflow.
end; if not(g.SyncOK) then
begin
//没有同步,寻找同步2字节
gBufferLength := g.BufferIndexTail-g.BufferIndexHead;
if gBufferLength<0 then gBufferLength := gBufferLength + HUANCHONGQU + 1; // Notice the border FROM V2.2
//-------------------------
while gBufferLength >3 do
begin
gBufferLength := g.BufferIndexTail-g.BufferIndexHead;
if gBufferLength<0 then gBufferLength := gBufferLength + HUANCHONGQU + 1; // Notice the border FROM V2.2
if (g.Buffer[g.BufferIndexHead ]=2) and (g.Buffer[g.BufferIndexHead +16]=13) then begin
//找到同步2字节
g.BufferIndexHead := g.BufferIndexHead +1;
if g.BufferIndexHead >HUANCHONGQU then g.BufferIndexHead := g.BufferIndexHead -HUANCHONGQU-1; // Notice the border FROM V2.2!!!
g.SyncOK := TRUE;
break;
end
else
begin
//没有找到同步2字节
g.BufferIndexHead := g.BufferIndexHead + 1;
if g.BufferIndexHead > HUANCHONGQU then g.BufferIndexHead := 0;
end;
end;
end
else
begin
//已经同步,可以开始分析数据
gBufferLength := g.BufferIndexTail - g.BufferIndexHead;
if gBufferLength < 0 then gBufferLength := gBufferLength + HUANCHONGQU + 1; // Notice the border FROM V2.2;
if (gBufferLength >=17) then
begin
//缓冲区中的有效数据不少于18个字节,可以开始分析
iCurrentContent := 256 * (g.Buffer [g.BufferIndexHead +1]); //仪表稳定 (g.Buffer[g.BufferIndexHead ])+
m.blnYiBiaoWenDing:=false; //初始为儀表不穩
lblStatus.Caption :='仪表未稳';
case iCurrentContent of 12288 : begin
sCurrentContent := chr(g.Buffer[g.BufferIndexHead + 3 ])
+ chr(g.Buffer[g.BufferIndexHead + 4 ])
+ chr(g.Buffer[g.BufferIndexHead + 5 ])
+ chr(g.Buffer[g.BufferIndexHead + 6 ])
+ chr(g.Buffer[g.BufferIndexHead + 7 ])
+ chr(g.Buffer[g.BufferIndexHead + 8 ]) ;
edt_zl.text := sCurrentContent;
m.blnYiBiaoWenDing :=true;
lblStatus.Caption:='仪表稳定' ;
end;
else
BEGIN
sCurrentContent := chr(g.Buffer[g.BufferIndexHead + 3 ])
+ chr(g.Buffer[g.BufferIndexHead + 4 ])
+ chr(g.Buffer[g.BufferIndexHead + 5 ])
+ chr(g.Buffer[g.BufferIndexHead + 6 ])
+ chr(g.Buffer[g.BufferIndexHead + 7 ])
+ chr(g.Buffer[g.BufferIndexHead + 8 ]) ;
edt_zl.text := sCurrentContent;
M.blnYiBiaoWenDing :=FALSE;
lblStatus.Caption:='仪表未稳' ;
END; end;
g.BufferIndexHead := g.BufferIndexHead +16 ;
if g.BufferIndexHead >HUANCHONGQU then g.BufferIndexHead := g.BufferIndexHead -HUANCHONGQU - 1; // Notice the border FROM V2.2;
g.SyncOK := FALSE;
end;
end;
except
end;
end;
ClearCommError(hComm,dwError,@CS); //取得状态
if cs.cbInQue =0 then
begin
//edt_zl.Text :='000000';
//lblStatus.Caption:='仪表未发送' ;
exit; //缓冲区为空,则退出
end;
ReadFile(hComm, DataByte,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据 for i:=0 to nBytesRead-1 do
begin
g.Buffer[g.BufferIndexTail] :=DataByte[i];
g.BufferIndexTail:=g.BufferIndexTail+1;
if g.BufferIndexTail >HUANCHONGQU then g.BufferIndexTail:=0; // care of overflow.
end; if not(g.SyncOK) then
begin
//没有同步,寻找同步2字节
gBufferLength := g.BufferIndexTail-g.BufferIndexHead;
if gBufferLength<0 then gBufferLength := gBufferLength + HUANCHONGQU + 1; // Notice the border FROM V2.2
//-------------------------
while gBufferLength >3 do
begin
gBufferLength := g.BufferIndexTail-g.BufferIndexHead;
if gBufferLength<0 then gBufferLength := gBufferLength + HUANCHONGQU + 1; // Notice the border FROM V2.2
if (g.Buffer[g.BufferIndexHead ]=2) and (g.Buffer[g.BufferIndexHead +16]=13) then begin
//找到同步2字节
g.BufferIndexHead := g.BufferIndexHead +1;
if g.BufferIndexHead >HUANCHONGQU then g.BufferIndexHead := g.BufferIndexHead -HUANCHONGQU-1; // Notice the border FROM V2.2!!!
g.SyncOK := TRUE;
break;
end
else
begin
//没有找到同步2字节
g.BufferIndexHead := g.BufferIndexHead + 1;
if g.BufferIndexHead > HUANCHONGQU then g.BufferIndexHead := 0;
end;
end;
end
else
begin
//已经同步,可以开始分析数据
gBufferLength := g.BufferIndexTail - g.BufferIndexHead;
if gBufferLength < 0 then gBufferLength := gBufferLength + HUANCHONGQU + 1; // Notice the border FROM V2.2;
if (gBufferLength >=17) then
begin
//缓冲区中的有效数据不少于18个字节,可以开始分析
iCurrentContent := 256 * (g.Buffer [g.BufferIndexHead +1]); //仪表稳定 (g.Buffer[g.BufferIndexHead ])+
m.blnYiBiaoWenDing:=false; //初始为儀表不穩
lblStatus.Caption :='仪表未稳';
case iCurrentContent of 12288 : begin
sCurrentContent := chr(g.Buffer[g.BufferIndexHead + 3 ])
+ chr(g.Buffer[g.BufferIndexHead + 4 ])
+ chr(g.Buffer[g.BufferIndexHead + 5 ])
+ chr(g.Buffer[g.BufferIndexHead + 6 ])
+ chr(g.Buffer[g.BufferIndexHead + 7 ])
+ chr(g.Buffer[g.BufferIndexHead + 8 ]) ;
edt_zl.text := sCurrentContent;
m.blnYiBiaoWenDing :=true;
lblStatus.Caption:='仪表稳定' ;
end;
else
BEGIN
sCurrentContent := chr(g.Buffer[g.BufferIndexHead + 3 ])
+ chr(g.Buffer[g.BufferIndexHead + 4 ])
+ chr(g.Buffer[g.BufferIndexHead + 5 ])
+ chr(g.Buffer[g.BufferIndexHead + 6 ])
+ chr(g.Buffer[g.BufferIndexHead + 7 ])
+ chr(g.Buffer[g.BufferIndexHead + 8 ]) ;
edt_zl.text := sCurrentContent;
M.blnYiBiaoWenDing :=FALSE;
lblStatus.Caption:='仪表未稳' ;
END; end;
g.BufferIndexHead := g.BufferIndexHead +16 ;
if g.BufferIndexHead >HUANCHONGQU then g.BufferIndexHead := g.BufferIndexHead -HUANCHONGQU - 1; // Notice the border FROM V2.2;
g.SyncOK := FALSE;
end;
end;
except
end;
把这个写成一个函数,为什么要写在定时器内,基本的风格还是要保持的。