2014-09-30 118 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