我已經在Delphi 7中構建了一些服務,並沒有這個問題。現在我在XE2中開始了一個新的服務應用程序,它不會正常停止。我不知道這是我做錯了什麼,或者它可能是XE2服務中的錯誤。德爾福XE2服務沒有正常停止
的執行過程是這樣的:
procedure TMySvc.ServiceExecute(Sender: TService);
begin
try
CoInitialize(nil);
Startup;
try
while not Terminated do begin
DoSomething; //Problem persists even when nothing's here
end;
finally
Cleanup;
CoUninitialize;
end;
except
on e: exception do begin
PostLog('EXCEPTION in Execute: '+e.Message);
end;
end;
end;
我永遠不會有一個例外,因爲你可以看到我日誌的任何異常。 PostLog
保存到INI文件,這工作正常。現在我使用ADO組件,因此我使用CoInitialize()
和CoUninitialize
。它確實連接到數據庫並正常工作。只有當我停止此服務時纔會出現問題。窗戶給我下面的消息:
然後服務繼續。我必須再次停止它。第二次,它不停止,但以下消息:
日誌文件表示該服務沒有成功免費(已登錄OnDestroy
事件),但它從來沒有成功地停止(OnStop
從未登錄)。
在我上面的代碼中,我有兩個程序Startup
和Cleanup
。這些簡單的創建/銷燬和初始化/取消初始化我必要的東西...
procedure TMySvc.Startup;
begin
FUpdateThread:= TMyUpdateThread.Create;
FUpdateThread.OnLog:= LogUpdate;
FUpdateThread.Resume;
end;
procedure TMySvc.Cleanup;
begin
FUpdateThread.Terminate;
end;
正如你所看到的,我有一個輔助線程運行。這個服務實際上有許多像這樣運行的線程,而主服務線程只記錄來自每個線程的事件。每個線程都有不同的責任。線程正確報告,並且它們也被正確終止。
什麼可能導致此停止失敗?如果我貼的代碼不公開什麼,然後我可以在以後發佈更多的代碼 - 只需要「轉換」,因爲內部命名的,等等
編輯
我剛開始在新的服務項目德爾福XE2,並有相同的問題。這是我所有的代碼如下:
unit JDSvc;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, JDSvcMgr;
type
TJDService = class(TService)
procedure ServiceExecute(Sender: TService);
private
FAfterInstall: TServiceEvent;
public
function GetServiceController: TServiceController; override;
end;
var
JDService: TJDService;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
JDService.Controller(CtrlCode);
end;
function TJDService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TJDService.ServiceExecute(Sender: TService);
begin
while not Terminated do begin
end;
end;
end.
不太可能是Delphi代碼中的錯誤。你可以把它削減到最低程度的複製。 – 2012-02-13 17:18:07
^^ +1。看來你的線程永遠不會終止,因此在SCM – whosrdaddy 2012-02-13 17:39:12
恕我直言,TMySvc.Cleanup例程的超時將會產生問題。你終止FUpdateThread,但你不知道什麼時候它真的被終止。添加WaitFor或使用同步對象來正確檢測終止。在這裏尋找更多的信息:http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch5.html – whosrdaddy 2012-02-13 17:50:49