我在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;
谁能告诉我我做错了什么?
答案 0 :(得分:4)
你使用
ServiceThread.ProcessRequests(True);
在您的服务循环中,WaitForMessage
设置为True
。
这将阻止你的循环,因为它将无限期地等待服务消息。
要解决您的问题,只需将您的行更改为:
ServiceThread.ProcessRequests(False);
一些一般性建议:
不要实现服务的OnExecute
处理程序,而是在OnStart
eventhandler中生成一个线程。从OnStop
Eventhandler终止此线程。
可以找到更多详细信息here。
使用非GUI线程中的TTimer
(就像您的情况中的服务线程一样)很棘手,但这并非不可能(David Heffernan有关于此主题的主题here on SO)。
答案 1 :(得分:0)
(解决) 结果是一个单元错误阻止服务响应。我将相关的.bpl包复制到了服务文件夹,这似乎解决了错误。
感谢大家花时间添加输入