首页 > 解决方案 > 防止 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”时尝试停止服务时,它会说服务没有响应,之后没有其他方法可以终止服务,而不是被任务管理器杀死。是否有更好的方法来实现它,以便服务将独立于其实际状态进行响应?

标签: delphiservice

解决方案


您必须MyProductiveFunction像编写延迟函数一样编写:定期处理请求并在服务被要求终止时终止该函数。

相反,您也可以创建另一个线程来执行MyProductiveFunction并从ServiceExecute调用ProcessRequest中检查是否终止。当请求终止时,您必须终止另一个线程。最好的办法是让这个其他线程检查共享的东西TEvent以终止,或者ServiceExecute可能会终止/中止该线程。


推荐阅读