【发布时间】:2018-09-26 11:28:58
【问题描述】:
间隔设置为 1 秒的 TTimer 每 1 秒发送一条消息。此消息在应用程序的消息循环中处理,从而触发 OnTimer 事件。
如果应用程序很忙并且没有时间处理消息循环,则跳过 OnTimer 事件。
我知道 TTimer 在内部使用 SetTimer。
我的问题是:
- TTimer 是否使用内部/单独的线程(通过 SetTimer)?
- 如果模态 MessageDlg 正在“阻塞”表单,那么保存计时器(甚至它的 OnTimer)的表单为什么仍然可以做事呢? (见下面的代码)
- 文档说 SetTimer 至少需要 Win2000。 TTimer 在 Win98 中是如何实现的?
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Caption = i;
i++;
MessageDlg(stuff); <----- we "block" application here but form's caption is still updated.
}
【问题讨论】:
-
这是一个低优先级的windows消息
WM_TIMER。见using timers. 不一定对精确时间测量有用。 -
为什么这个问题被否决了?它无效/不相关?
-
完全是推测,但否决票可能与所要求的内容和接受的内容有关。它们似乎完全不相关,这可能表明您问错了问题。
-
@SertacAkyuz - 1. 在我发布问题后立即投下了反对票。所以它与接受的答案无关。 2. 事实上,基思提供的答案并没有回答我的具体问题。然而,它确实为这个问题带来了一些启示。而且因为它是唯一(好的)答案.... :)
-
“文档说SetTimer最低要求Win2000。TTimer在Win98中是如何实现的?”。
SetTimer已经存在于 Windows 98/95 甚至 Windows 3 上。微软在其文档中简单地放弃了对早于 Windows 2000 的 Windows 版本的任何引用。
标签: windows delphi winapi rad-studio ttimer