我有一个用Delphi编写的Windows服务。它偶尔使用的第三方资源会出现损坏,而我找到的唯一解决方法是退出并重新启动程序。我可以从程序内部检测到资源是否损坏,并且我可以告诉Windows在停止后重新启动服务,但我无法弄清楚如何使服务自己停止。
这个程序相当简单。我按照正常的方式创建了一个服务应用程序。我有一个TService的子类来管理服务,而所有的功能都发生在一个独立的线程中。 TService子类基本上只是管理子线程的执行,而在子线程中我将检测到数据损坏。
供参考,这是服务和子线程的头信息。
type
TScannerThread = class(TThread)
private
Scanner : TScanner;
DefaultDir : String;
ImageDir : String;
procedure CheckScanner;
public
Parent : TComponent;
procedure Execute; override;
end;
TCardScanSvc = class(TService)
procedure ServiceCreate(Sender: TObject);
procedure ServiceExecute(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
private
ScannerThread : TScannerThread;
public
function GetServiceController: TServiceController; override;
end;
var
CardScanSvc : TCardScanSvc;
在GUI应用程序中,我会调用Application.Terminate,但TServiceApplication似乎没有这个方法。我可以终止子线程,但主线程从来不会注意到,而且Windows认为服务仍在运行。我真的想不出还有什么要尝试的了。
该程序最初是在Delphi 5中创建的,我目前正在使用Delphi 2007,如果有任何区别的话。
Edit:
通过mghie的代码,我可以停止服务,但是Windows只有在服务意外失败时才会重新启动服务,而不是在正常停止服务时重新启动服务。我要做的是制作一个单独的服务应用程序,让第一个服务发出信号告知第二个服务是否出现问题,然后第二个服务重启第一个服务。