У меня есть служба Windows, написанная на Delphi. Один из сторонних ресурсов, которые он использует, иногда повреждается, и единственный способ исправить ситуацию - это выйти и перезапустить программу. Я могу определить, когда ресурс поврежден изнутри программы, и могу сказать 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;
В приложении с графическим интерфейсом я бы вызвал Application.Terminate, но TServiceApplication, похоже, не имеет такого метода. Я могу прекратить подпоток, но основной поток никогда не замечает, и Windows считает, что служба все еще работает. Я не могу придумать, что еще можно попробовать.
Программа изначально была создана в Delphi 5, и в настоящее время я использую Delphi 2007, на случай, если что-то изменится.
Edit:
С помощью кода mghie я могу остановить службу, но Windows перезапустит службу только в случае неожиданного сбоя, а не в случае его нормальной остановки. Я собираюсь создать отдельное приложение-службу, дать первый сигнал второму, если у него возникнут проблемы, а затем второй перезапустить первый.