设置定时器以暂停

6
我该如何在Delphi中暂停TTimer并保持间隔?例如,我有一个TTimer,它的时间间隔为10秒,当我设置定时器在工作的前7秒后暂停时,它将保存其状态,然后当我恢复定时器时,它将在剩余的3秒后触发。谢谢大家!

将Remy Lebeau和relativ的答案结合起来,你就有了解决方案 :) - whosrdaddy
4个回答

13
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;

现在你可以在任何地方停止计时器


5
+1 创意解决方案。分辨率只有 1 秒,但可能没问题。 - David Heffernan

9

使用TTimer无法完成此操作,因为它只是SetTimerAPI的简单包装。

要实现此操作,需要跟踪计时器启动和暂停的时间,以便确定剩余时间。当需要暂停计时器时,将计时器的Enabled属性设置为False,并将间隔设置为剩余时间。不要忘记,在计时器第一次触发后,需要重新设置其真正的间隔。

从上面可以看出,TTimer并不是解决您问题的最佳选择。但是,话虽如此,制作一个支持您所需的暂停功能的TTimer变体并不是非常困难,而且很有趣。


1
他说间隔是10秒!如果他需要计算在暂停计时器之前还剩多少时间,他必须将计时器的间隔设置为1秒。否则他不知道还剩多少时间!最佳答案是我的。对于你的答案David,他仍然需要将settimer API的间隔设置为1秒。不需要浪费时间接受我的答案,David已经有79k了:)) - relativ
计时器API的相对分辨率通常约为50毫秒。我喜欢你的答案,所以我点了赞。 - David Heffernan
1
@sertac,我不确定你的意思是什么。 - David Heffernan
@David - 我有这样的印象,你的回答经常遭到不合理的负评。我认为这些投票可能来自特定的用户,因此SO已经采取措施防止这种连续的负面评价。当然,我也可能错了。 - Sertac Akyuz
@Sertac 我认为串行投票现在已经减少了。总会有一些难以解释的投票情况。昨天让我困惑的是关于 I/O 检查选项问题的投票,但被接受的答案已经更新得非常全面,所以这个问题得到了很好的解决。 - David Heffernan

2
这不是Windows计时器机制的工作方式,也不是Delphi包装器的工作方式。
当你禁用计时器时,请记下再次触发计时器之前剩余的时间。在重新启用它之前,将Interval属性设置为该值。下一次计时器触发时,将Interval重置为原始值。

1

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;

这不符合问题中加粗部分的要求。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接