仅在线程/计时器内执行一次命令,但保持线程/计时器运行?

时间:2011-11-29 21:08:27

标签: delphi

这是线程内部代码的一部分(或者它可能是一个计时器,无关紧要):

timenow := Now;
strtime := FormatDateTime('hh:nn:ss', timenow);
if frmBackup.getmetime = strtime then
begin
  frmBackup.lawl.Position := frmBackup.lawl.Position + 10;
end;

基本上,进度条只是一个测试,可以知道它执行了多少次。到目前为止,我无法阻止它执行多次。我需要它执行一次(当getmetime = strtime时)然后继续线程/定时器而不执行代码,只在时间到来时再次执行它。

可能的?

谢谢!

1 个答案:

答案 0 :(得分:6)

在frmBackup上放置一个布尔标志:

timenow := Now;
strtime := FormatDateTime('hh:nn:ss', timenow);
if (frmBackup.getmetime = strtime) and (not frmBackup.RanOnce) then
begin
  frmBackup.lawl.Position := frmBackup.lawl.Position + 10;
  frmbackup.RanOnce := true;
end;

另外,请注意尝试将时间与=进行比较。如果您的计时器比您瞄准的时间晚了一秒,无论出于何种原因,您的代码都会失败。最好使用> =或在比较中建立一些误差范围。 (并使用直接TDateTime比较而不是字符串比较。)

另外一件事:如果你实际上在另一个线程中,(而不是在同一个线程上运行的计时器),更新VCL控件将以奇怪的方式失败,因为底层的Windows API内容具有线程亲和力你的程序的主线程。如果您打算这样做,请查看TThread.SynchronizeTThread.Queue并使用其中一个进行UI更新。