delphi - 防止 Delphi 服务无响应
问题描述
我的问题如下:我用 Delphi Tokyo 实现了一个 Windows 服务,但恕我直言,这不是版本问题,而是设计问题。我使用以下代码暂停我的服务并在该状态下做出响应。
procedure TMyService.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
MyProductiveFunction;
Delay(10000);
end;
end;
procedure TMyService.Delay(Milliseconds: integer);
var
Tick: DWord;
Event: THandle;
begin
LogOnLevel(clogger, CAS_LOGGER.Debug, '', ['Delay', 'ENTER', 'Delayed for ' + Milliseconds.ToString]);
Event := CreateEvent(nil, False, False, nil);
try
Tick := GetTickCount + DWord(Milliseconds);
while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <>
WAIT_TIMEOUT) do
begin
ServiceThread.ProcessRequests(False);
if Terminated then
exit;
Milliseconds := Tick - GetTickCount;
end;
finally
CloseHandle(Event);
end;
end;
我有时运行的功能非常耗时。当我在延迟过程中尝试停止服务时,它会停止并且一切都很好。但是,当我在运行“MyProductiveFunction”时尝试停止服务时,它会说服务没有响应,之后没有其他方法可以终止服务,而不是被任务管理器杀死。是否有更好的方法来实现它,以便服务将独立于其实际状态进行响应?
解决方案
您必须MyProductiveFunction
像编写延迟函数一样编写:定期处理请求并在服务被要求终止时终止该函数。
相反,您也可以创建另一个线程来执行MyProductiveFunction
并从ServiceExecute
调用ProcessRequest
中检查是否终止。当请求终止时,您必须终止另一个线程。最好的办法是让这个其他线程检查共享的东西TEvent
以终止,或者ServiceExecute
可能会终止/中止该线程。
推荐阅读
- java - 使用服务模式和使用独立存储库 Spring Data REST 有什么区别?
- pdf - 在 adobe reader 中打开 PDF 时出现错误
- css - React Native - 居中 flexWrap 容器的内容
- python - def __str__(self) 问题 - Django
- c# - 从网站 HtmlAgilityPack 检索基本值
- javascript - 将菜单项链接到同一页面,但显示不同的 div
- unity3d - Unity协程(MEC)未调用
- javascript - while(array.length) 如何在没有任何增量/减量的情况下工作
- rest - 如何通过 Delphi 在 Google Drive API 上调用创建权限
- webpack - webpack DllPlugin:WEBPACK_EXTERNAL_MODULE_dll_reference 未定义