- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序中有一个 TTimer,每 2 秒触发一次并调用我的事件处理程序 HandleTimerEvent()。 HandleTimerEvent() 函数会修改共享资源,并且在返回之前可能需要 10 秒的时间来执行。此外,我有时会在事件处理程序中调用 Sleep() 来放弃处理器。
我不确定 C++ builder 的 TTimer 对象在调用事件时如何工作,因此我刚刚解释的场景让我思考,特别是在先前的调用返回之前是否调用 HandleTimerEvent()。
这个问题归结为以下几件事。
TTimer 对象是否对事件进行排队?
TTimer 对象可以在先前的调用返回之前调用我的事件处理程序吗?
最佳答案
此回复假设 TTimer 仍被实现为使用 WM_Timer 消息。如果实现发生了变化(自 2005 年以来),请忽略。
不,TTimer 对象不会对事件进行排队。它是由Windows WM_TIMER消息驱动的,Windows不会让WM_TIMER消息在消息队列中堆积。如果出现下一个计时器间隔并且 Windows 发现应用程序的消息队列中已存在 WM_Timer 消息,则它不会向队列中添加另一个 WM_Timer 消息。 (顺便说一句,WM_Paint 也一样)
是的,即使先前的事件处理程序仍在执行,TTimer.OnTimer 事件也可能被触发。如果您在事件处理程序中执行任何允许应用程序处理消息的操作,则可以重新输入计时器事件。显而易见的是,如果您的事件处理程序调用 Application.ProcessMessages,但它可能比这更微妙 - 如果您在事件处理程序中调用的任何内容在内部调用 Application.ProcessMessages,或调用 PeekMessage/GetMessage + DispatchMessage,或打开模式对话框,或调用绑定(bind)到进程外 COM 对象的 COM 接口(interface),然后应用程序消息队列中的消息将被处理,并且可能包括您的下一条 WM_Timer 消息。
一个简单的解决方案是在进入计时器事件处理程序时禁用计时器对象,并在退出计时器事件处理程序时重新启用它。这将防止在事件处理程序仍在工作时触发计时器消息,无论代码的消息处理特性如何。
关于delphi - TTimer.OnTimer 事件处理程序是可重入的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311246/
我必须使用遗留代码。该代码在主线程中创建了一个TTimer。 在OnTimer事件中,计时器会定期检查工作线程中某些数据的状态。 伪代码: procedure MainForm.OnTimer(Sen
我遇到了一个奇怪的问题。我的主窗体上有一个 TTimer,应该触发 500 毫秒。创建表单后。 当我从 IDE 运行它时,它工作正常,但是当我在其他 W7 PC 上运行它时,会创建主窗体,但计时器不会
当我将 TTimer 间隔设置为 1 时,它实际上是每 1 毫秒执行一次代码,还是每 20 毫秒或类似的东西? 我问这个问题是因为我知道 Windows API Sleep() 函数不准确,所以我想知
谁在设计时绘制 TTimer? 使用 Delphi IDE 的表单设计器时,当您将 TTimer 放在表单上时,该组件在设计时可见(但当然,在运行时不可见)。 TTimer 类是在 ExtCtrls
我试图在 Delphi 中实现类似于 Javascript 的 setTimeout() 过程的行为:在延迟几秒钟后运行。为此,我在运行时创建了一个 TTimer,运行它,然后释放它。 这是我的代码:
如您所知,我在使用 Delphi 2010 开发的应用程序中的 TTimer VCL 组件遇到了一些问题。 每当我打电话时: Self.Timer1.Enabled := False; Self.Ti
我有一个带有 TTimer (timAnimateDataChange) 的 TFrame (fraDisplay)。定时器用于控制一个小动画。在包含框架的表单中,我想要一个执行类似以下操作的方法:
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Delphi Timer: Time before next event 在 Windows 7 Pro(64 位)
我想检测文件日期何时更改并更新用作 Tdatasource 的 DevX TdxMemData,然后在使用它的 TDBGrid 中看到该数据源。 我发现一些使用 ReadDirectoryChange
我的应用程序中有一个 TTimer,每 2 秒触发一次并调用我的事件处理程序 HandleTimerEvent()。 HandleTimerEvent() 函数会修改共享资源,并且在返回之前可能需要
谁能帮助我如何在 Delphi 中使用 TTimer 组件显示一个简单的计时器?我有一个标签,其中将显示从 5-0 开始的倒计时。请帮忙。只是一个简单的。谢谢 最佳答案 你没有说 5 和 0 之间的时
我有一个简单的 TTimer 问题,它启动并在主应用线程中执行其 OnTimer 事件,代码如下所示: procedure TForm1.DoSomeStuff(); begin OmniL
我有TTimer启用并且应该永远不间断地运行,直到用户停止它。然而,事实并非如此。在 OnTimer 事件中,它以毫秒为单位一遍又一遍地处理窗口消息。 例如,这是我的代码片段。 procedure T
我两天前开始学习Delphi,但我陷入了困境。我崩溃了,因为一切都不如我所愿,所以我决定在这里写下来。我想创建一个类,该类有一个带有自己的 TTimer 对象的字段,并且它将在某个时间间隔执行某些操作
当我从 TTimer 访问全局变量或 VCL 时,是否需要使用 Synchronize?我使用来自 TThread 的相同变量和对象,我已经在其中使用了同步。 最佳答案 TTimer的OnTimer事
我们必须使用 CoFreeUnusedLibrariesEx 来修复使用 MSXML 库后堆未清除的错误引用这个链接: http://blogs.msdn.com/b/marcelolr/archiv
我现在想做的是使用 TMemo 组件和 TTimer 创建滚动信用文本 procedure TAboutBox.Timer1Timer(Sender: TObject); begin Memo1
我开发了一个应用程序,它连接到 SQL Server 数据库并每 1 秒从表中读取一些数据。 为此,我使用 TTimer,但数据库响应的延迟会影响我的应用程序性能。 我对Delphi中的TThread
正如问题主题所说。我在 Delphi 中有一个控制台应用程序,其中包含一个 TTimer 变量。我想做的是将事件处理程序分配给 TTimer.OnTimer 事件。我对 Delphi 完全陌生,我曾经
我在 Windows 10 上使用 Delphi XE7。 我已经使用下面的代码很长时间了,只是阅读了SetTimer()上的文档。简单地说,我是从非 UI 线程设置计时器,但 Microsoft 的
我是一名优秀的程序员,十分优秀!