【问题标题】:Creating a wait using getTickCount in Delphi在 Delphi 中使用 getTickCount 创建等待
【发布时间】:2013-12-13 16:14:22
【问题描述】:

我正在创建一个需要运行的程序,然后等待 10 分钟再继续

procedure firstTimeRun(const document: IHTMLDocument2);
var
  fieldValue : string;
  StartTime : Dword;
begin
  StartTime := GetTickCount();
  WebFormSetFieldValue(document, 0, 'Username', '*******');
  WebFormSetFieldValue(document, 0, 'Password', '*******');
  WebFormSubmit(document, 0);
 if (GetTickCount() >= StartTime+ 600000) then
 begin
   SecondRun();
 end; 
 end; 

我遇到的问题是,当我到达 if 语句时,它会检查它是否不正确,然后继续我如何让它保持不变并等到该语句为真?

【问题讨论】:

  • 你不能使用 TTimer 吗?
  • 注意,如果你在主线程中运行它,它会阻塞 UI(10 分钟!)。如果是这样,请不要使用建议的方式,也不要尝试通过调用 Application.ProcessMessages 来“修复”该块。

标签: delphi timer wait gettickcount


【解决方案1】:

天真的答案是你需要一个while 循环:

while GetTickCount() < StartTime+600000 then
  ;
SecondRun();

或者更容易阅读,repeat 循环:

repeat
until GetTickCount() >= StartTime+600000;
SecondRun();

但这是错误的做法。您将热运行处理器 10 分钟,但一无所获。而且我掩盖了这样一个事实,即如果您的系统已经运行了 49 天,那么您将点击GetTickCount wrap-around,然后测试的逻辑就有缺陷。

操作系统有一个专门用来解决你的问题的功能,叫做Sleep

Sleep(600000);

这会阻塞调用线程指定的毫秒数。因为线程是块,所以线程在等待的时候不会消耗CPU资源。

这将使调用线程无响应,因此您通常会在后台线程而不是应用程序的主线程中执行此操作。

【讨论】:

  • 我一直在研究睡眠,但似乎有很多人对使用它犹豫不决,这就是我问的原因。
  • 好吧,它被广泛误用了。但是,如果您确实需要等待很长时间并且想要阻止,那么它是完美的。在您不想运行消息队列的保持活动计时器的后台线程中通常很有用。在您的情况下,避免睡眠,但用忙碌的循环代替它同样会引起不喜欢睡眠的人的愤怒。我个人是讨厌睡眠的人之一,但只有当它被误用时。
  • 人们误用它的原因是他们只想解决问题,不想考虑 Windows 应用程序中阻塞调用问题的整个背景。 OP的问题表明他就是这样一个人。
  • @David 我无法想象任何程序的任何部分,在其中 block 10 分钟是有意义的 - 只是关闭这样的应用程序就可以让你等待在最坏的情况下持续 10 分钟 :o)
  • @TLama 阻塞的后台线程不会阻塞终止。 ExitProcess 完成工作。
猜你喜欢
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
相关资源
最近更新 更多