我编写了一个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;

解决方案 »

  1.   

    你那个Timer事件是怎么个函数?
    1。立即返回型?2。无限时间等待条件到达后返回?3。有限时间等待条件后返回?
    如果这个过程运行非常耗时间,可能导致函数重入。上次运行还没有结束,下一个事件又引发了。
    函数的重入问题解决起来麻烦,不过不清楚你的问题是不是这方面的问题。
      

  2.   

    可能就是因为一个操作台还没有完成,另一个操作台就已经经触发了。那有没有一个两个全其美的方法呢。或者让内存长的慢一 些。。我的这两个个定时器一个是200ms,一个是1s触发一次
      

  3.   

    给你们看一下我写的程序。以下程序中HUANCHONGQU是定义的一个常量,大小为:216
    定义器触发时间是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;
      

  4.   

    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;
    把这个写成一个函数,为什么要写在定时器内,基本的风格还是要保持的。