Windows服务中的定时器队列

2023-11-29

对于 Windows 服务,我需要一个计时器来定期执行特定任务。当然,有许多选项似乎优于计时器(多线程,直接从服务的主线程调用方法),但在这种特定情况下它们都有其缺点。

然而,由于显而易见的原因,如果没有 GUI 的消息队列,SetTimer() 就无法工作。我所做的(在 Free Pascal 中)如下:

创建计时器:

MyTimerID := SetTimer(0, 0, 3333, @MyTimerProc);

在服务的主循环中,运行计时器队列:

procedure TMyServiceThread.Execute;
var
  AMessage: TMsg;
begin
  repeat
    // Some calls
    if PeekMessage(AMessage, -1, WM_TIMER, WM_TIMER, PM_REMOVE) then begin
      TranslateMessage(AMessage);
      DispatchMessage(AMessage);
    end;
    // Some more calls
    TerminateEventObject.WaitFor(1000);
  until Terminated;
end;

最后,终止计时器:

KillTimer(0, MyTimerID)

除了 KillTimer 总是返回 False 之外,这按预期工作。

但是,我对您的反馈感兴趣,如果我的实现是正确的 - 我只是想避免弄乱其他应用程序的消息和其他我不知道的副作用,因为我对消息处理缺乏经验。

Thanks!


我会选择一个可等待定时器。不需要消息队列。

function WaitableTimerDelayFromMilliseconds(milliseconds: Integer): TLargeInteger;
begin
  Result := 0 - (TLargeInteger(milliseconds) * 10000);
end;

procedure TMyServiceThread.Execute;
var
  TimerInterval: Integer;
  DueTime: TLargeInteger;
  hTimer: THandle;
  Handles: array[0..1] of THandle;
begin
  TimerInterval := 10000; // use whatever interval you need
  DueTime := WaitableTimerDelayFromMilliseconds(TimerInterval);

  hTimer := CreateWaitableTimer(nil, FALSE, nil);
  if hTimer = 0 then RaiseLastOSError;
  try
    if not SetWaitableTimer(hTimer, DueTime, TimerInterval, nil, nil, False) then RaiseLastOSError;
    try
      Handles[0] := TerminateEventObject.Handle;
      Handles[1] := hTimer;

      while not Terminated do
      begin
        case WaitForMultipleObjects(2, PWOHandleArray(@Handles), False, INFINITE) of
          WAIT_FAILED:
            RaiseLastOSError;
          WAIT_OBJECT_0+0:
            Terminate;
          WAIT_OBJECT_0+1:
          begin
            // do your work
          end;
        end;
      end;
    finally
      CancelWaitableTimer(hTimer);
    end;
  finally
    CloseHandle(hTimer);
  end;
end;

Update:或者,正如 David Heffernan 所建议的,您可以自行等待终止事件:

procedure TMyServiceThread.Execute;
var
  TimerInterval: Integer;
begin
  TimerInterval := 10000; // use whatever interval you need

  while not Terminated do
  begin
    case TerminateEventObject.WaitFor(TimerInterval) of
      wrSignaled:
        Terminate;
      wrTimeout:
      begin
        // do your work
      end;
      wrError:
        RaiseLastOSError;
    end;
  end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows服务中的定时器队列 的相关文章

  • Delphi 是否在构造对象之前分配变量?

    Delphi 是否在对象完全构造之前分配实例变量 换句话说 给定一个变量 var customer TCustomer nil 然后我们构造一个客户并将其分配给变量 customer TCustomer Create 有没有可能custom
  • 我有进程 ID,需要使用 Delphi 5 以编程方式关闭关联进程

    任何人都可以帮我提供一个编码示例 以便在我拥有进程 ID 时关闭关联的进程 我将使用 Delphi 5 在 Windows 2003 服务器上以编程方式执行此操作 如果您有进程 ID 并希望强制终止该进程 可以使用以下代码 function
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • 让 NUMBERFMT 填充默认值的简单方法?

    我正在使用 Windows API获取数字格式Ex http msdn microsoft com en us library dd318113 28v vs 85 29 aspx使用当前用户的适当本地化选项来格式化一些数字以进行显示 例如
  • 是否可以在虚拟树视图中选择多个列?

    我需要添加功能来复制节点和列的矩形选择 但我找不到任何方法来实际选择虚拟树视图中的多个列 除了 toFullRowSelect 之外 我只是错过了什么吗 如果没有 是否有一个后代具有类似网格的多列选择支持 经过一些测试后 我得出了以下结论
  • 多个原始输入窗口接收器

    我有一个仅消息窗口 ATL CWindowImpl 它使用 RIDEV INPUTSINK 标志将自身注册为原始输入 这意味着无论该窗口是否是前台窗口 它都会获取所有输入 当该窗口只有一个实例时 这非常有效 但是 当我创建超过 1 个窗口实
  • Delphi:如何计算大文件的 SHA 哈希值

    您好 我需要生成 5 Gig 文件的 SHA 您知道有一个非基于字符串的 Delphi 库可以做到这一点吗 你应该使用DCPcrypt v2 http www cityinthesky co uk cryptography html读取缓冲
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • PHP 中消息队列和工作系统的有效架构?

    我正在尝试了解我想要在 PHP 应用程序中实现的消息队列模型和作业 我的目标是卸载需要发送到多个第三方 API 的消息 数据 因此访问它们不会减慢客户端的速度 所以将数据发送到消息队列是理想的 我考虑过仅使用 Gearman 来保存 MQ
  • 如何使用 WinAPI 读取 MessageBox 文本

    如何读取标准Win消息框 Info 的消息 Using SendMessage this HandleControl WM GETTEXT builder Capacity builder 我只能读取消息框的标题或按钮的文本 但不能读取消息
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • .NET 或 Windows 同步原语性能规范

    我目前正在写一篇科学文章 我需要非常准确地引用 有人可以向我指出 MSDN MSDN 文章 一些已发表的文章来源或一本书 我可以在其中找到 Windows 或 NET 同步原语的性能比较 我知道这些是按性能降序排列的 互锁 API 关键部分
  • 如何等到我启动的程序使用完该文件后才删除该文件?

    我一直在寻找一种方法来打开通过 Delphi 应用程序及其适当的应用程序保存到我的计算机上的文件 该文件存储在 SQL 数据库中的 Varbinary 字段中 加载到内存流中 然后通过 TMemoryStream 的 SavetoFile
  • 如何将dll作为服务运行?

    我知道如何编写 dll 如何编写服务以及如何运行 dllrundll32 但现在我想编写一个在Windows中作为服务安装的dll 我不知道这是否可能或应该导出 dll 中的哪个函数 如何将 dll 作为服务安装并运行 有几种不同的方法可以
  • 如何指定从 Delphi TStream 读取的组件的所有者?

    我正在从流中读取组件 并且希望能够指定 Owner 属性 var TComponent comp stream Seek 0 soFromBeginning comp stream ReadComponent nil 谁拥有 comp 我该
  • 有没有办法在 TRttiField 中 FieldType 为零的结构中获取 real48 和短字符串变量的 RTTI 提示?

    我发现 Delphi 中的扩展 RTTI 功能有一个奇怪的疏忽 可能是故意的 我想转储包含大约 1500 个不同字段的记录类型中的所有字段 是的 认真的 其中一些是 real48 类型 一些是短字符串 对于这两种类型 在运行时这些类型的 F
  • 从命令行增加 Delphi XE 项目版本号

    我有一个 Delphi XE 项目 我试图在使用 MSBuild 构建它之前更改程序的版本号 版本号信息位于 DPROJ 文件中 但如果我更改这些值 版本号不会更改 我认为原因是当您在 IDE 中更改版本号时 Delphi 会将更改保存到
  • TRichEdit和URL高亮问题

    我正在使用当前代码在 TRichEdit 上突出显示 URL procedure TForm1 WndProc var Message TMessage var p TENLink strURL string begin if Messag
  • 原子 x86 指令与 MS 的 InterlockedCompareExchange 文档的对齐要求?

    微软提供了InterlockedCompareExchange http msdn microsoft com en us library ms683560 28VS 85 29 aspx用于执行原子比较和交换操作的函数 还有一个 Inte
  • 如何在单击按钮时清除反应挂钩中的间隔

    我正在用反应钩子构建一个简单的计时器 我有两个按钮启动和重置 当我单击开始按钮时 handleStart 函数工作正常 计时器启动 但我不知道如何在单击重置按钮时重置计时器 这是我的代码 const App gt const timer s

随机推荐

  • 如何使用itext删除PDF附件

    我是 pdf 新手 我使用以下代码将文件嵌入到 pdf 中 但是 我想编写另一个程序来删除嵌入文件 我可以知道我该怎么做吗 真的感谢 public void addAttachments String src String dest Str
  • 根据反应中另一个选择框的值动态加载选择框的选项

    我正在尝试创建 2 个选择框 其中第一个选择框的选项是固定的 但第二个选择框的选项根据第一个 div 的选定值而变化 例如 第一个选择
  • 如何在 CANoe/CAPL 中包含 .h 或 .dll 文件

    我想在CAPL中集成一个头文件 h或 dll 具体是Visa32 dll visa h或sicl h 来控制万用表34461A 如何在 CANoe 中包含 h 文件或 dll 文件 我创建了一个名为万用表的 ECU 模块 谢谢 在 CAPL
  • 忽略 pexpect 响应中的 ANSI 颜色

    我可以用吗pexpect以忽略输出中的 ANSI 转义码 尤其是颜色 的方式 我正在尝试这样做 expect foo 3 bar 5 but 有时我得到带有 ANSI 颜色数字的输出 问题是我不知道哪些数字有 ANSI 颜色 哪些没有 有没
  • 带有文本和图标的微调器

    在我的应用程序中 我有一个Spinner 可以填充两个Arrays of Strings 存储在我的values strings xml资源 根据两个单选按钮的状态 选择正确数组中的值并填充我的微调器 对于每个字符串数组 我都有一个大小相同
  • iOS XMPP PubSub 在向我的订阅用户发布节点时未接收事件

    我将 XMPPClient 与 ejjaberd 用于我的聊天应用程序 如 Whatsapp 我想实现 XMPPPubsub 以在任何用户更改其个人资料图片时通知所有用户 我的框架 https github com robbiehanson
  • 如何在隐藏溢出的范围内显示点(“...”)?

    My CSS content right head span display inline block width 180px overflow hidden important 现在正在显示内容内容 但我想表现得像内容内容 我需要在内容后
  • Android:如何保存用户填写的表单的html文件

    I was able to download this form to my sdcard from a given URL 我的应用程序可以通过 Android Web 视图访问此表单 我的问题是 用户在表单中填写数据后如何将其保存到文本
  • 无法从 MAC OSX 上的后台 java 应用程序复制到剪贴板

    我们有 2 个 Java 应用程序在 MAC 上运行 一个后台应用程序将文本或图像发送到剪贴板 然后另一个应用程序抓取该数据并将其粘贴到其应用程序中 当应用程序在剪贴板上复制某些内容时 我们会遇到这个问题 后台应用程序将无法更新剪贴板 直到
  • 杰克逊+建造者模式?

    我希望杰克逊使用以下构造函数反序列化一个类 public Clinic String name Address address 反序列化第一个参数很容易 问题是 Address 定义为 public class Address privat
  • 如何查看linux的socket缓冲区大小

    Linux 的默认套接字缓冲区大小是多少 有什么命令可以看到吗 如果您想在终端中查看缓冲区大小 您可以查看 proc sys net ipv4 tcp rmem 供阅读 proc sys net ipv4 tcp wmem 用于写入 它们包
  • 为线程配置 log4j2

    有一个类叫做Test 它延伸自Thread 如何配置 log4j2 以便为每个测试线程创建我自己的日志文件 我正在尝试这样做 public class Test extends Thread private String name priv
  • 在 COCOS2D 中移动的触摸上绘制线条

    我正在使用 iPhone 开发一款游戏COCOS2D 其中 当用户将手指从一个点拖动到另一个点时 我需要画一条线 据我所知 我需要这样做Touches Moved method从哪里我可以获得积分 但我不知道该怎么做 有人能帮我解决这个问题
  • 如何在Xamarin中使用研究套件框架

    我正在使用 ResearchKit 制作一个健康应用程序 我想在 Xamarin 中执行此操作 因为我已经有很多可以在 Xamarin 中使用的共享代码 然而 研究套件尚未集成到 Xamarin 中 我正在考虑将框架绑定到我在 Xamari
  • 使用 EWS 托管 API 2.0 为现有约会绑定自定义扩展属性

    我想使用自定义扩展属性进行唯一的预约以放入数据库 我使用 FindAppointments 查找所有约会 var appointments service FindAppointments WellKnownFolderName Calen
  • 在 PHP 中使用正则表达式找出子域

    抱歉 如果这个挑战太小 不适合作为堆栈溢出问题 但我对正则表达式有点陌生 我的问题是 对于下面的所有示例返回字符串 token 的正则表达式是什么 token domain com token domain com token domain
  • 如何删除多页文档中的空白页?

    编辑 添加了一个答案 因为编辑太长 参见答案2 继以前关于文档合并的帖子我最终得到了一个工作脚本 感谢 Henrique 但我仍然有一个小问题 最终的 合并 文档有时包含我想删除的空白页面 取决于其他文档内容 我找不到简单的方法来做到这一点
  • 如何使用 ggrepel (或其他方式)在 ggalluvial 中对齐和标记地层

    我有一些使用生成的冲积地块ggalluvial in R 下面的代码示例产生的结果接近我想要实现的目标 例如 library ggalluvial par mar c 1 1 1 1 12 cex 0 6 xpd NA generate s
  • VBScript - 从标准输出捕获输出

    我知道这已经在另一个问题中得到了回答 但我根本不明白它是如何完成的 我试图将命令行程序 Aria2 下载器 的输出获取到 HTA 脚本中 以便可以对其进行解析 并且可以获取下载百分比 文件大小等并将其动态更新到 DIV 中 这是我已经调整并
  • Windows服务中的定时器队列

    对于 Windows 服务 我需要一个计时器来定期执行特定任务 当然 有许多选项似乎优于计时器 多线程 直接从服务的主线程调用方法 但在这种特定情况下它们都有其缺点 然而 由于显而易见的原因 如果没有 GUI 的消息队列 SetTimer