【发布时间】:2010-10-14 15:11:47
【问题描述】:
我有一个用 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,以防万一。
编辑:
使用 mghie 的代码,我可以停止服务,但 Windows 只会在服务意外失败时重新启动服务,而不是在正常停止的情况下。我要做的是制作一个单独的服务应用程序,如果有问题,让第一个信号发出第二个信号,然后让第二个重新启动第一个。
【问题讨论】:
标签: delphi winapi windows-services