2014-09-30 65 views
0

我在德尔福XE做了一个服务,将无法启动在Windows 7中,从服务管理器提示时,我得到德尔福XE服务将无法启动:错误1053

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; 

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

+0

这将是很好的你学习如何调试这种事情。从一个全新的空服务项目开始。这是否启动,或者这是否也失败,错误1053.这是你应该尝试做的第一件事。 – 2014-09-30 08:44:19

+0

@TOndrej,你确定?那么你会如何提出一个在延迟中循环执行的服务呢? (请不要说了Thread.Sleep) – 2014-09-30 10:41:38

+0

使用循环'WaitForSingleObject' /'WaitForMultipleObjects'会更好...... – whosrdaddy 2014-09-30 10:45:03

回答

4

你在你的业务循环使用

ServiceThread.ProcessRequests(True); 

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

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

ServiceThread.ProcessRequests(False); 

一些普遍性的建议:

不执行OnExecute处理服务,但产卵在OnStart事件处理一个线程来代替。从OnStop事件处理程序终止此线程。 更多细节可以发现here

从非GUI线程(如您的案例中的服务线程)使用TTimer非常棘手,但并非不可能(但David Heffernan在此主题上有一个主题here on SO)。

+0

尝试了您的建议,结果相同:( – 2014-09-30 09:48:37

+0

@BjarkeMoholt您为什么要忽略我的建议?是否开始一个全新的空白服务项目? – 2014-09-30 10:50:29

+0

@大卫没有,同样的错误。如果一个行会解决我的问题,我之前你为什么要在服务应用程序中使用运行时包要通过较大规模的测试程序 – 2014-09-30 11:00:57

0

(解决) 它原来是从响应阻止该服务的单元错误。我将相关的.bpl包复制到服务文件夹,似乎解决了错误。

谢谢大家花时间添加您的输入

+0

知道吗? – whosrdaddy 2014-10-14 11:38:10

+0

因为包包含的功能,我想重用。这是我的第一个服务,我经历了很多反复试验,现在我明白了为什么它可能不是最好的想法,所以我已经删除了软件包并修改了服务 – 2014-10-14 11:55:53

+0

无论如何,我的答案是仍然正确,请记住这一点。正如你所看到的,当提问时,细节很重要。 – whosrdaddy 2014-10-14 12:11:10