定时器触发延时太长问题

时间:2021-06-29 23:37:02
使用定时器定时触发刷新数据,在数据为1024个时(比如显示转速)时间反应很快,可是当显示三相的数据1024*3=3072时(比如显示输入电压),无论我将定时器的时间从3秒改为30秒,图像都无法显示,如果把定时器关了,图像在1秒左右就跳出来了,请问问题处在哪里啊?
代码如下:
//转换并存储数据
procedure TForm5.Button3Click(Sender: TObject);
var
k,x,i:integer;
jj:integer;

begin
  max1:=-9999.0; max2:=-9999.0; max3:=-9999.0;
  s1:=0.0; s2:=0.0;s3:=0.0;s4:=0.0;s5:=0.0;s6:=0.0;
  s7:=0.0; s8:=0.0;s9:=0.0;s10:=0.0;s11:=0.0;s12:=0.0;
  memo1.Clear;memo2.Clear;memo3.clear;memo4.Clear;
  memo5.Clear;memo6.Clear;memo7.clear;memo8.Clear;
  memo9.Clear;memo10.Clear;memo11.clear;memo12.Clear;
  memo13.Clear;

  jj:=0;

  {for k:=0 to count-1 do
  begin
    b[k]:=a[k];
  end;}
  for k:=0 to (count div 2)-1 do
  begin
   b[k]:=(a[jj]+256*a[jj+1]);
   jj:=jj+2;
   if b[k]<$8000 then
     begin
       b[k]:=b[k]/32768;
     end
   else
     begin
       b[k]:=(b[k]-65536)/32678;
     end;
  end; 

  //显示输入电压曲线
  if xuanze=1 then
  begin
      
      Fastlineseries1.Clear;Fastlineseries1.Clear;Fastlineseries1.Clear;
      i:=0;  x:=0;
      while(i<3072) do
      begin
        //Series1.Addxy(x*0.2,b[i],'',clred);
         Fastlineseries1.AddXY(x*0.2,b[i],'',clred);
        //Series2.Addxy(x*0.2,b[i+1],'',clgreen);
         Fastlineseries2.Addxy(x*0.2,b[i+1],'',clgreen);
        //Series3.Addxy(x*0.2,b[i+2],'',clblue);
        Fastlineseries3.Addxy(x*0.2,b[i+2],'',clblue);
        i:=i+3;
        x:=x+1;
      end;


      i:=0;
      while(i<3072) do
      begin
        s1:=s1+b[i];
        if max1<b[i] then
                  begin
                    max1:=b[i];
                  end;
        memo1.Lines.Add(floattostr(b[i]));
        memo1.lines.savetofile('A相输入电压.txt');
        i:=i+3;
      end;
    m1:=max1;
    v1:=max1/1.414;
    a1:=s1/1024;
    ComboBox2Change(Sender);

      i:=1;
      while(i<6144) do
      begin
        s2:=s2+b[i];
        if max2<b[i] then
                  begin
                    max2:=b[i];
                  end;
        memo2.Lines.Add(floattostr(b[i]));
        memo2.lines.savetofile('B相输入电压.txt');
        i:=i+3;
      end;
    m2:=max2;
    v2:=max2/1.414;
    a2:=s2/1024;
    ComboBox3Change(Sender);

      i:=2;
      while(i<3072) do
      begin
        s3:=s3+b[i];
        if max3<b[i] then
                  begin
                    max3:=b[i];
                  end;
        memo3.Lines.Add(floattostr(b[i]));
        memo3.lines.savetofile('C相输入电压.txt');
        i:=i+3;
      end;
    m3:=max3;
    v3:=max3/1.414;
    a3:=s3/1024;
    ComboBox4Change(Sender);
  end;


   //显示转速曲线
   if xuanze=3 then
   begin
      Series13.Clear;
      for i:=0 to 1023 do
      begin

        memo13.Lines.Add(floattostr(b[i]));
        memo13.lines.savetofile('转速.txt');
      end;
      drawClick(Sender);
   end;

end;


//处理控件中的该事件,获取底层交换数据和连线状态
procedure TForm5.MSComm1Comm(Sender: TObject);
var
  i,inputlen,tmpint:integer;
  tmpvar:variant;
begin
  
  if mscomm1.CommEvent=comevreceive then
  begin
    delay(100);
    inputlen:=mscomm1.InBufferCount;
    tmpvar:=mscomm1.Input;
    count:=count+inputlen;
    for i:=0 to inputlen-1 do
      begin
        tmpint:=tmpvar[i];
        index:=i+j;
        a[index]:=tmpint;
      end;
    j:=index+1;
  end;
end;


//显示转速
procedure TForm5.Button4Click(Sender: TObject);
begin
  command:=3;
  Button2Click(Sender);
  delay(100);
  Button3Click(Sender);
end;
//启动数据刷新
procedure TForm5.BitBtn15Click(Sender: TObject);
begin
  if timer20.Enabled=true then
  begin
    timer20.Enabled:=false;
    BitBtn15.Caption:='启动刷新';

  end
  else begin
    command:=2;
    timer20.Enabled:=true;
    BitBtn15.Caption:='停止刷新';
  end;
end;
//定时器定时刷新数据
procedure TForm5.Timer20Timer(Sender: TObject);
begin
  if command=1 then
  begin
    BitBtn2Click(Sender);
  end
  else
  if command=2 then
  begin
    BitBtn5Click(Sender);
  end
  else
  if command=3 then
  begin
    Button4Click(Sender);
  end
  else
  if command=4 then
  begin
    BitBtn8Click(Sender);
  end
  else
  if command=5 then
  begin
    BitBtn11Click(Sender);
  end
  else
    begin
      exit;
    end;
end;



8 个解决方案

#1


建一个线程专门显示图像~~

#2


是不是刷的太快,比如有数据回来慢的时候
你又发送命令,造成数据阻塞了
把定时器触发代码改成如下试试


//定时器定时刷新数据 
procedure TForm5.Timer20Timer(Sender: TObject); 
begin 
  timer20.Enabled := False ;// 先设置timer不可用
  try  // 加个try异常捕获,防止下面的过程出错
  if command=1 then 
  begin 
    BitBtn2Click(Sender); 
  end 
  else 
  if command=2 then 
  begin 
    BitBtn5Click(Sender); 
  end 
  else 
  if command=3 then 
  begin 
    Button4Click(Sender); 
  end 
  else 
  if command=4 then 
  begin 
    BitBtn8Click(Sender); 
  end 
  else 
  if command=5 then 
  begin 
    BitBtn11Click(Sender); 
  end 
  else 
    begin 
      exit; 
    end; 
  finally  // finally
    timer20.enabled := true; //定时器重新设置为可用
  end; // try的end
end; 



#3


你把定时器只使用一次 数据是否能刷出来 如过可以刷出来要多久?
你把定时器时长再加更长 看数据能否刷出来 如过可以刷出来要多久?
你把数据改为1024 然后定时器时间缩小比如1s 看数据能否刷出来 如过可以刷出来要多久?

另外检查下你下面几个函数:

ComboBox2Change(Sender); 
ComboBox4Change(Sender); 
drawClick(Sender); 

建议你加一个线程专门显示图像 

#4


定时器这个东东最好是不用,起码是少用。多用多线程。

#5


定时器启动线程 处理

#6


最好启用线程处理!

#7


线程处理,不见得一定好.

#8


我是想在已有的基础上改,越简单越好

#1


建一个线程专门显示图像~~

#2


是不是刷的太快,比如有数据回来慢的时候
你又发送命令,造成数据阻塞了
把定时器触发代码改成如下试试


//定时器定时刷新数据 
procedure TForm5.Timer20Timer(Sender: TObject); 
begin 
  timer20.Enabled := False ;// 先设置timer不可用
  try  // 加个try异常捕获,防止下面的过程出错
  if command=1 then 
  begin 
    BitBtn2Click(Sender); 
  end 
  else 
  if command=2 then 
  begin 
    BitBtn5Click(Sender); 
  end 
  else 
  if command=3 then 
  begin 
    Button4Click(Sender); 
  end 
  else 
  if command=4 then 
  begin 
    BitBtn8Click(Sender); 
  end 
  else 
  if command=5 then 
  begin 
    BitBtn11Click(Sender); 
  end 
  else 
    begin 
      exit; 
    end; 
  finally  // finally
    timer20.enabled := true; //定时器重新设置为可用
  end; // try的end
end; 



#3


你把定时器只使用一次 数据是否能刷出来 如过可以刷出来要多久?
你把定时器时长再加更长 看数据能否刷出来 如过可以刷出来要多久?
你把数据改为1024 然后定时器时间缩小比如1s 看数据能否刷出来 如过可以刷出来要多久?

另外检查下你下面几个函数:

ComboBox2Change(Sender); 
ComboBox4Change(Sender); 
drawClick(Sender); 

建议你加一个线程专门显示图像 

#4


定时器这个东东最好是不用,起码是少用。多用多线程。

#5


定时器启动线程 处理

#6


最好启用线程处理!

#7


线程处理,不见得一定好.

#8


我是想在已有的基础上改,越简单越好