Delphi NT Service作为客户端(不是服务器),OnExecute vs OnStart

时间:2017-11-29 12:08:30

标签: multithreading delphi

我需要使用Delphi实现Windows NT服务作为我项目的一部分。 在开始实施之前(程序已经完成并且只等待这个),由于任务的复杂性(以及我对系统事物的了解减少了),我将非常感谢任何能够给我一个关于这个主题的想法。

在提出我的问题之前,我会就项目的性质说几句话: 我在Delphi中编写的是一个程序,它读取NT事件查看器日志并将它们发送到其他地方。由于事物的自动化,我被要求将其实现为Windows NT服务。 我必须强调这项服务不是任何类型的服务器(TCP,SMTP ......)。它仅作为客户端 - 读取日志并发送它们。因此(我认为)我不需要多行程,我很高兴这是因为多线程编程是一个“大骨头”#34;对于很多人,包括我。我想运行这个"例程"在每10秒到1分钟之间的某个范围内。在这种情况下,读取NT事件查看器记录(从最后一次发送)的任务通常很短,几秒钟,但在某些情况下可能很长(1分钟或更长) - 当服务停止(或失败)时有时和未发送的记录已累积。在后一种情况下,操作员将在文档中被指示不要停止服务(至少没有终止),直到完成当前传输 - 这可以在更新的某个文本调试文件中看到。

我已多次阅读本网站上几乎所有相关文章,尤其是下面两篇:

  1. " delphi服务应用程序在15秒后停止,计时器未执行"非常感谢你在这里建议不使用TTimer以及第二篇文章
  2. "使用Delphi制作服务应用程序的教程"作者:Finn Tolderlund
  3. 现在完全基于这篇文章2,我的问题是:

    问题: 在我的条件下 - 我可以使用OnExecute解决方案吗?

    我希望我可以,因为我(想想!)我不需要多线程;而且代码更简单。

    最好的问候 阿尔通

1 个答案:

答案 0 :(得分:2)

远离TService.OnExecute事件。编写错误非常容易,并且服务因响应SCM请求而死锁。

使用TService.OnStart事件启动工作线程,使用TService.On(Stop|Shutdown)事件终止该线程。线程可以运行一个循环来处理(重新)打开到目标的连接,并根据需要读取+转发日志条目。