- 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/
嗨,我已经阅读了 Java 中的 ReadWriteLock,但我不确定我是否掌握了它的重入部分。这是两个仅使用一个主线程来显示重入的简短代码示例 public class Locks { p
我在使用 NotifyIcons 时发现了一个重入问题。重现它真的很容易,只需在表单上放置一个 NotiftIcon,点击事件应该如下所示: private bool reentrancyDetect
我正在尝试使用 SQLite 的新 C 接口(interface)预更新 Hook : https://www.sqlite.org/c3ref/preupdate_count.html 现在回答我的
来自阅读here我发现 Actor 是可重入的,并且我希望以下情况成立:如果我有单一类型的转换 ThespianType 但有三个特定的 Actor ThespianType (T1、T2 和 T3)
有人可以向我解释一下 BlockReentrancy 的目的是什么吗?方法在ObservableCollection ? MSDN显示以下内容作为示例: //The typical usage is
我是一名优秀的程序员,十分优秀!