【发布时间】:2011-12-13 05:49:03
【问题描述】:
如何在 Delphi 中暂停 TTimer 并保持间隔?因此,例如,我有 10 秒间隔 的 TTimer,当我将计时器设置为暂停 在工作的前 7 秒 后,它将保存其状态,并且然后当我恢复计时器时,它会在剩余 3 秒后触发。
非常感谢大家!
【问题讨论】:
-
结合 Remy Lebeau 的答案和 relativ 的答案,你就有了解决方案:)
如何在 Delphi 中暂停 TTimer 并保持间隔?因此,例如,我有 10 秒间隔 的 TTimer,当我将计时器设置为暂停 在工作的前 7 秒 后,它将保存其状态,并且然后当我恢复计时器时,它会在剩余 3 秒后触发。
非常感谢大家!
【问题讨论】:
Timer.interval :=1000;
ICount:integer;
在创建过程中将 icount 设置为 0
Procedure timerevent(sender:tobject);
Begin
If icount=10 then
Begin
// do proccess
Icount = 0;
End;
Inc(icount);
End;
现在你可以在任何地方停止计时器
【讨论】:
您无法使用 TTimer 来做到这一点,它是对 SetTimer API 的松散包装。
为此,您需要跟踪计时器的启动时间和暂停时间。然后你就会知道还剩多少时间。当您需要暂停时,将计时器Enabled 属性设置为False,并将间隔设置为剩余时间量。不要忘记,在计时器第一次触发后,您需要将其间隔重置为真实间隔。
从上面可以看出,TTimer 并不是最适合您的问题。但是,话虽如此,生成一个支持以您希望的方式暂停的TTimer 变体并不是非常困难,而且非常有趣。
【讨论】:
这不是 Windows 计时器工具的工作方式,也不是 Delphi 包装器的工作方式。
当您禁用计时器时,请注意在它再次触发之前还剩多少时间。在重新启用它之前,请将 Interval 属性设置为该值。下次计时器触发时,将 Interval 重置为原始值。
【讨论】:
TTimer 不支持您的要求。正如其他人已经评论的那样,您必须停止计时器,将其 Interval 重置为剩余时间,启动它,然后在触发下一个 OnTimer 事件时停止并将其 Interval 重置为 10 秒。
一个更简单的解决方案是让TTimer 保持正常运行,并有一个单独的标志告诉OnTimer 事件处理程序是否可以在它被触发时完成它的工作,例如:
var
Boolean: Paused = False;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not Paused then
begin
// do proccess
end;
end;
procedure TForm1.PauseButtonClick(Sender: TObject);
begin
Paused := True;
end;
procedure TForm1.ResumeButtonClick(Sender: TObject);
begin
Paused := False;
end;
【讨论】: