Delphi定时器-不那么简单

Delphi定时器-不那么简单,delphi,delphi-2009,Delphi,Delphi 2009,我正在Windows10上使用Delphi2009 我有一个简单的计时器(JvTimer,但是TTimer也有同样的问题),它的间隔在对象检查器中设置为1000ms。它在标签中显示倒计时 我已经做过很多次了,但由于某种原因,这次不起作用了。它似乎随机跳过9、7、5等等 我已经更改了标签、计时器、间隔,但仍然是一样的-调试给出了正确的步骤,但只要我在调试器之外运行它,我就会发现问题 var timeout: integer; procedure TForm1.Timer1Timer(Send

我正在Windows10上使用Delphi2009

我有一个简单的计时器(
JvTimer
,但是
TTimer
也有同样的问题),它的
间隔在对象检查器中设置为1000ms。它在标签中显示倒计时

我已经做过很多次了,但由于某种原因,这次不起作用了。它似乎随机跳过9、7、5等等

我已经更改了标签、计时器、间隔,但仍然是一样的-调试给出了正确的步骤,但只要我在调试器之外运行它,我就会发现问题

var
  timeout: integer;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if timeout1 < 1 then
  begin
    jvTimer1.Enabled := False; 
    if WindowState = wsNormal then
      WindowState := wsMinimized;
  end
  else
  begin
    Dec(timeout1);
    LabeledEdit5.Text := IntToStr(timeout1);
  end;
end;
var
超时:整数;
程序TForm1.Timer1Timer(发送方:TObject);
开始
如果超时1小于1,则
开始
jvTimer1.Enabled:=False;
如果WindowsState=wsNormal,则
WindowState:=wsp;
结束
其他的
开始
12月(超时1);
LabeledEdit5.Text:=IntToStr(timeout1);
结束;
结束;

计时器不是很精确。不要通过计算计时器事件的执行次数来计算时间

相反:启动计时器时,请记住变量中的当前TDateTime,然后在计时器事件中,通过将当前时间与记住的启动时间进行比较,计算启动计时器后经过的时间。

谢谢Dave, 我对它进行了黑客攻击以提供MCVE,我发现了问题所在。 不知怎的,这个错误已经悄悄地出现了!! 我已经创建了两次主窗体。这一定是导致计时器出现问题的原因。 克里斯


我们不能使用MCVELabeled5。更新可能会对您有所帮助。听起来好像其他事情正在进行,没有时间重新绘制控件。谢谢-但我已经尝试过了,并且刷新了表单。没有区别。奇怪的是,如果我创建一个新项目,只需要一个计时器、按钮和标签,它就可以正常工作。当ttimer倒计时时,原始程序中没有导致任何事件的内容。此外,数字以更高的速率倒计时(大约500毫秒-即7-5-3以1秒的间隔进行),尽管数字以正确的速率变化。非常奇怪!!我在调试模式下测试它-如果我在除计时器事件之外的每个函数和过程中放置断点,它们都不会被触发,因此我假设如果我在没有调试的情况下运行,这与任何其他部分都不会有任何关系-仍然是同一个问题。一秒钟的计时器肯定不会导致问题!据我所知,应用程序中没有同时发生其他事件。@用户如果您不向我们显示代码,我们如何提供帮助。为什么我们不能有一个MCVE?是否需要帮助?还要将超时变量从全局变量更改为表单类的成员字段,以便表单的不同实例不使用相同的变量。
program mail2p;    
uses
  madExcept,
  madLinkDisAsm,
  madListHardware,
  madListProcesses,
  madListModules,
  Forms,
  mail2 in 'mail2.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
 // Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.