TTimer.OnTimer 事件处理程序是可重入的吗?

2024-01-03

我的应用程序中有一个 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,或打开模式对话框,或调用绑定到进程外 COM 对象的 COM 接口,然后应用程序消息队列中的消息将被处理,并且可能包括下一条 WM_Timer 消息。

一个简单的解决方案是在进入计时器事件处理程序时禁用计时器对象,并在退出计时器事件处理程序时重新启用它。这将防止在事件处理程序仍在工作时触发计时器消息,无论代码的消息处理特性如何。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TTimer.OnTimer 事件处理程序是可重入的吗? 的相关文章

  • 调用泛型类型的方法?

    为什么下面的代码在 Delphi XE 中会产生错误 unit UTest interface type TTest class public procedure Foo
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或
  • 获取字符、整数和日期字段的字段 oldValue 和 newValue

    我试图只保留表更改的历史记录 所以我想获取一个字段在更改为oldValue之前的值 然后获取它更改为newValue的值 两个值都应转换为字符串 因此 这是该表的一个示例 PartNumber Description 12345 Test
  • Delphi 的免费加密库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在为 Delphi 2010 寻找一个免费且最新的加密库 该库实现 RSA 和 AES Rijnda
  • 如何将 TGifImage 中的帧提取为位图?

    下面的演示尝试在表单的画布上绘制 GIF 这不起作用 图像不会前进 如何让它发挥作用 procedure TForm1 FormCreate Sender TObject begin GIF TGIFImage Create GIF Loa
  • 如何向标准集合编辑器添加图标?

    我有一个自定义控件 它利用TCollection and TCollectionItem 在集合编辑器中 我想向每个列表项添加图标 该列表项由内部TImageList 在其父组件内 集合项本身代表图标 我想在这个编辑器中显示相应的图标 如何
  • 使用 TStringList 的分隔符解析字符串,似乎也解析空格(Delphi)

    我有一个简单的字符串 由某个字符分隔 比如说逗号 我应该能够创建一个 TStringList 并将其分隔符设置为逗号 然后将 DelimitedText 设置为我想要解析的文本 并且应该自动解析它 问题是 当我查看输出时 它还包含空格作为分
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • Delphi 5 的哈希表实现 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道 Delphi 5 的良好且免费的哈希表实现吗 我需要在哈希表中组织大量数据 并且我有点担心在网
  • 是否可以声明长度受限且不从 0/1 开始的字符串类型?

    在 Delphi 中 可以声明整数值的子范围 例如 type myInt 2 150 它将 myInt 类型的值限制为 2 到 150 之间的值 但是如果我想限制字符串的长度怎么办 如果我写 type myString string 150
  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • Delphi 2010 - 从 XML 文档解码 Base64 编码图像

    我正在尝试从应用程序中的 XML 文档解码 base64 编码的 EMF 图像并将其呈现在屏幕上 但是 它似乎从未出现 如果我将 XML 文档中的数据复制 粘贴到 Notepad 中并使用Base64 Decode选项并将文件另存为 emf
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 防止多个实例 - 但还要处理命令行参数?

    我正在从我的应用程序处理与 Windows 相关的扩展文件 因此 当您在 Windows 中双击文件时 它将执行我的程序 然后我从那里处理该文件 如下所示 procedure TMainForm FormCreate Sender TObj
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • 如何在Delphi中将对象方法作为参数传递,然后调用它?

    我担心这可能是一个有点愚蠢的问题 但这让我很难过 我正在寻找将对象的方法传递到过程中的最简单的方法 以便过程可以调用对象的方法 例如 超时后 或者可能在不同的线程中 所以基本上我想 捕获对对象方法的引用 将该引用传递给过程 使用该引用 从过
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa
  • 使用 PutBlock 并将字节数组全部设置为零的 EIPHTTPProtocolExceptionPeer 异常

    使用 Delphi XE2 Update 3 我在将零字节块上传到 Azure 时遇到问题 当我说零字节时 我指的是每个元素设置为零的字节数组 不是零长度 例如 var ConInfo TAzureConnectionInfo RespIn
  • 如何在表单上绘制半透明图像?

    我想在 Delphi 窗体上绘制半透明图像 但由于某种原因它不起作用 Here is the original PNG border is semi transparent 我将图像加载到TImage object Image1 Trans

随机推荐

  • 将位置参数作为 args 和可选参数作为 kwargs 整齐地从 argparse 传递到函数

    我想编写一个Python脚本 它通过以下方式获取一些必要的位置和一些可选的命令行参数argparse 让我们调用位置参数a b c 以及可选参数x y z 在我的 Python 脚本中 我想将这些参数传递给一个函数 具体来说 我想要a b
  • 流畅的 NHibernate 映射

    我是 NHibernate 和 Fluent NHibernate 的新手 假设我有如下情况 Table Activities uniquidentier ID varchar ActivityName Table ActivityPara
  • 为什么 Azure 应用程序网关需要空子网

    当我尝试执行 New AzureRmApplicationGatewayIPConfiguration 来创建应用程序网关时 出现异常 Subnet xxx cannot be used for application gateway yy
  • 单元测试 Modelica 组件库?

    我正在 Modelica 中创建一个组件库 并且希望获得一些有关对包进行单元测试的技术的意见 到目前为止 我有一个测试包 由一组模型组成 每个组件一个模型 每个测试模型都会实例化一个组件 并将其连接到一些非常简单的帮助器类 这些类提供必要的
  • MVC 4:验证失败时返回引导模式内部的部分视图

    我正在使用 MVC 4 和 SimpleMembership 用于帐户处理 当用户登录网页时 我正在使用 Boostrap V3 2 0 模式 模态工作正常 甚至通过 Ajax BeginForm 处理 Modelstate 验证我遇到的问
  • 设计控制器导轨

    我在 ruby 1 8 7 上使用 Rails 3 并用于身份验证 设计 1 1 3 但这是我正在构建的一个相当大的社区网站 因此我有一个用于配置文件的表和一个用于用户的表 每次用户注册时 它也应该生成一个配置文件 但在设计中我不允许使用控
  • SCons 无法选择编译器(MinGW)[重复]

    这个问题在这里已经有答案了 我有一个简单的 SConstruct 文件 其中包含以下代码 path C MinGW bin env Environment ENV PATH path Program target myprogram sou
  • 在 Kivy 中显示 numpy/opencv/matplotlib 图像

    如何在 Kivy 中以标准 numpy opencv matplotlib 格式显示图像 Kivy 使用不同的图像内存布局 我不知道是哪一种 下面的代码完全可以正常工作 图像是使用 cv2 VideoCapture 捕获的 我认为图像是BG
  • Windows XP 上的 Vb6 http post 请求

    我在使用 VB6 发送 POST 请求时遇到问题 下面的代码在 Windows7 上运行正常 但在 Windows XP 上运行时没有任何运行时错误 并且发送数据包 但看起来没有在数据包中附加发布数据 我的代码是这样的 Set xmlhtt
  • 如何在 Windows 上设置 Python 2.6 的安装工具?

    有没有办法在 Windows 中安装 Setuptools for Python 2 6 而无需 exe 安装程序 目前还没有构建这个工具 Setuptools 的维护者表示 他可能需要一段时间才能实现它 有谁知道安装它的方法吗 第一个选项
  • 获取StorageFolder中的文件数量

    我正在使用 Windows Phone 8 1 RT 应用程序 我想知道如何获取StorageFolder 内的文件数量 我知道我们可以使用StorageFolder GetFilesAsync 然后检查返回的列表的计数 但由于此方法花费的
  • SSIS 配置连接字符串

    我的一些包裹遇到了问题 基本布局是连接字符串存储在数据库中的 SSIS 配置表中 我最近注意到 oledb 连接的服务器名称似乎保持静态 我看到过将包从一个环境移动到另一个环境时验证失败的情况 如果我将密码更改为第一个环境中使用的密码 它将
  • 获取一个返回两个整数的函数

    我正在编写一个函数 我希望它返回两个整数作为结果 但是 我无法让它做到这一点 有人可以帮助我吗 这是我最好的镜头 public static int calc int s int b int c int d int g if s g ret
  • 如何打印悬空指针以进行演示?

    我试图向某人解释为什么他们有一个悬空指针以及 free 实际上是如何工作的 指针是值 因此是按值传递的 但为此我认为我需要一种打印指针的方法t 不确定 就像这样printf p ptr memcpy 可以解决这个问题吗 char buf1
  • 警告消息:在文件中(文件,“rt”)[重复]

    这个问题在这里已经有答案了 我在尝试着将 CSV 文件导入到项目图表中 我在用着RMac OS X 上的 2 15 2 第一种方式尝试过 我尝试运行以导入 CSV 文件的脚本是这样的 group4 lt read csv XXXX csv
  • hbase 作为 Web 应用程序中的数据库

    关于在真实的 Web 应用程序中使用 hadoop 或相关技术的一个大问题 我只是想了解 Web 应用程序如何使用 hbase 作为其数据库 我的意思是 这是大数据应用程序所做的事情 还是他们使用普通数据库并仅使用这些技术进行分析 拥有一个
  • 从 C# 代码中访问 $(SolutionDir) 和 $(DevEnvDir) 等预构建宏的简单方法是什么?

    现在我正在考虑在预构建事件中写入文件的路径 然后在代码中读取该文件 但我想知道是否有更简单更优雅的方法 编辑 这是一种后续行动帮助一步构建所有项目 安装程序 NET WiX https stackoverflow com questions
  • 使用seaborn包关闭jointplot上的边际分布轴

    我喜欢这个特定的绘图以及将函数传递给 stat func 关键字以快速绘制和可视化变量之间关系的能力 但有一点 如何 关闭 或不绘制边际分布轴 它看起来不错 但有时我不想要这个功能 例如使用以下代码 import numpy as np i
  • 用于插入的 Guava 缓存侦听器

    我们会发现拥有一个非常有用AddListener补充RemovalListener在谷歌番石榴中 有没有合适的替代品AddListener这将补充RemovalListener 您可以自己提供 只需将您的自定义侦听器传递到您的计算即可Fun
  • TTimer.OnTimer 事件处理程序是可重入的吗?

    我的应用程序中有一个 TTimer 每 2 秒触发一次并调用我的事件处理程序 HandleTimerEvent HandleTimerEvent 函数会修改共享资源 并且在返回之前可能需要 10 秒的时间来执行 此外 我有时会在事件处理程序