gpt4 book ai didi

delphi - 强制 TService OnStop 事件等到某个作业完成

转载 作者:行者123 更新时间:2023-12-03 19:06:32 25 4
gpt4 key购买 nike

在 Delphi 中使用 Windows 服务应用程序时,我偶然发现了该主题中的问题。

我确实在 IDE 上启动了一个默认的 Delphi Windows 服务项目,按照向导进行操作,最后我有了一个项目和一个
T服务单位。我向这个项目添加了另一个单元,一个包含服务代码逻辑的数据模块(名为 DM)。
DM 有一个运行相对较长工作的 TTimer(设计时)。

情况1:
DM 是在设计时默认创建的。我的 TService 启动/停止中有以下代码

procedure TOmegaCAOraNT.ServiceStart(Sender: TService; 
var Started: Boolean);
begin
DM.Timer1.Enabled := True;
Started := true;
end;

procedure TOmegaCAOraNT.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
DM.Agent_Stop;
Stopped := true;
end;

当我尝试通过 Windows SCM 停止服务时 - 外观上它确认停止,字段状态变为空 - 但事实并非如此。
我可以看到服务 .exe 仍在运行一段时间,而且它确实终止了 Timer 在中间的长时间工作,
只做一部分!
这是不受欢迎的行为!

我在第二种情况下解决了这个问题

案例二:
DM 是在运行时创建的。定时器在 DM.OnCreate 上启用
我的 TService 启动/停止中有以下代码
procedure TOmegaCAOraNT.ServiceStart(Sender: TService; var Started: Boolean); 
begin
FDataModule := TDM.Create(nil);
Started := true;
end;

procedure TOmegaCAOraNT.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
FreeAndNil(FDataModule);
Stopped := true;
end;

当我尝试通过 Windows SCM 停止服务时 - 它会引发以下警告:

"Windows could not stop the SERVICE> service on the Local Computer. The service did not return an error. his could be an internal Windows error or an internal service error. if the error persists, contact your system Administrator"



字段状态保持为已启动。 Timer'long job完成到结束,然后服务才真正停止(在SCM中刷新查看,Status为空)
这是理想的行为!

我的问题是我希望在设计时而不是在运行时创建 DM

我的问题是:
我可以在设计时 DM(案例 1)中获得运行时 DM(案例 2)的正确行为吗?

谢谢和最好的问候,
阿尔廷

最佳答案

TService在运行时运行是自己的工作线程。

如果您将 DM 配置为自动创建,它(及其 TTimer )将在运行时在主线程中创建,而不是在服务线程中创建。因此,TTimer将在主线程中运行,并且只能由主线程激活,不能在 TService.OnStart 中激活事件处理程序(如果您尝试,将引发 EOutOfResources 异常)。

如果您在 TService.OnStart 中手动创建 DM事件处理程序,它(及其 TTimer )将在服务线程中创建,而不是在主线程中。 TTimer将在服务线程中运行,并且可以在 TService 中(取消)激活事件。

无论哪种方式,请确保您的 TTimer.OnTimer事件处理程序使用线程安全代码。

此外,TService.OnStop事件处理程序必须调用 TService.ReportStatus()方法周期性地(在 TService.WaitHint 间隔过去之前),同时等待其他线程停止它们正在做的任何事情。这意味着您不应该在 TService.OnStop 中使用线程阻塞代码。事件处理程序。

您没有正确处理此问题,这就是 SCM 出现问题的原因。

关于delphi - 强制 TService OnStop 事件等到某个作业完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47702769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com