【问题标题】:Delphi XE Service won't start: Error 1053Delphi XE 服务无法启动:错误 1053
【发布时间】:2014-11-24 19:31:57
【问题描述】:

我有一个在 Delphi XE 中创建的服务,当 Windows 7 中的服务管理器提示时无法启动,我明白了

Error 1053: The service did not respond to the start or control reqquest in a timely fashion

我将服务与 AfterInstall 和 OnExecute 事件挂钩,这是我的事件代码:

procedure TAarhusRunner.ServiceAfterInstall(Sender: TService);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
  try

    Reg.RootKey := HKEY_LOCAL_MACHINE;
    if Reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, false) then
    begin
      Reg.WriteString('Description', 'Worker Service for Inversion Job Distribution');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

procedure TAarhusRunner.ServiceExecute(Sender: TService);
begin
  try
    Self.Status := csRunning;

    //start the loop
    MainTimer.Interval := 5000; //MainTimer is declared in the .dfm
    MainTimer.Enabled := True;
    RecheckAndApplyTimer.Enabled := False;
    while not Terminated do
    begin
       ServiceThread.ProcessRequests(true);
       MainTimer.Enabled := False;
    end;

  except
    on e: Exception do begin
      MessageDlg(E.Message,mterror,[mbok],0);
      exit;
    end;
  end;
end;

谁能告诉我我做错了什么?

【问题讨论】:

  • 学习如何调试这类东西对你有好处。从一个全新的、空的、服务项目开始。是否开始,或者是否也失败并出现错误 1053。这是您应该尝试做的第一件事。
  • @TOndrej,你确定吗?那么,您将如何提出一个在循环中执行且有延迟的服务呢? (请不要说thread.sleep)
  • 使用WaitForSingleObject/WaitForMultipleObjects 的循环会更好...
  • 我现在运行了一个空服务,仍然是错误 1053
  • 那么你为什么要在这些代码上浪费我们的时间?!你应该问的是,为什么一个空白的服务项目无法启动。我建议你问这个问题。当你问这个问题时,我首先要问的是运行服务的用户帐户。

标签: delphi service


【解决方案1】:

你使用

ServiceThread.ProcessRequests(True);

在您的服务循环中,将WaitForMessage 设置为True。 这将阻止您的循环,因为它将无限期地等待服务消息。

要解决您的问题,只需将您的行更改为:

ServiceThread.ProcessRequests(False);

一些一般性建议:

不要实现服务的OnExecute 处理程序,而是在OnStart 事件处理程序中生成一个线程。从OnStop Eventhandler 终止这个线程。 更多详情请见here

使用来自非 GUI 线程的TTimer(如您的情况下的服务线程)很棘手,但这并非不可能(David Heffernan 有一个关于此主题的主题 here on SO)。

【讨论】:

  • 试过你的建议,同样的结果:(
  • @BjarkeMoholt 你为什么无视我的建议?是否启动了全新的空白服务项目?
  • @David 不,同样的错误。如果一条线可以解决我的问题,我必须在进行更大规模的测试程序之前知道
【解决方案2】:

(已解决) 结果证明是一个单元错误导致服务无法响应。我将相关的 .bpl 包复制到服务文件夹,这似乎解决了错误。

感谢大家花时间添加您的意见

【讨论】:

  • 为什么要在服务应用程序中使用运行时包?
  • 因为包包含我想重用的功能。这是我的第一次服务,我经历了很多试验和错误。现在我明白了为什么这可能不是最好的主意,所以我删除了包并精简了服务
  • 无论如何,我的回答还是正确的,所以请记住这一点。如您所见,提问时细节很重要......
猜你喜欢
  • 2011-11-16
  • 2016-01-09
  • 1970-01-01
  • 2012-12-16
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多