Hallo Mavarik.
Zitat:
oder erhalten die "nur" einen Stopevent...
Ja die Dienste erhalten über den ServiceHandler ein SERVICE_CONTROL_SHUTDOWN.
Zitat:
Kann es sein, dass ich einfach nicht schnell genug alle erzeugten Threads beende?
Ja, wenn PServiceStatus^.dwWaitHint kleiner als die Zeit, die für das Beenden aller Threadss benötigt wird, ist.
Also wie ich das verstanden habe ist dein Dienst wie folgt aufgebaut:
DispatchTable initialisieren -> @serviceproc -> ServiceName
StartServiceCtrlDispatcher -> @serviceproc
RegisterServiceCtrlhandler -> SetServiceStatus
ServiceMain -> WorkerCode + WorkerThreads -> WairFor -> Event -> ServiceHandler
Nach Signalling des Synchronisationsobjects(Event) wird in der ServiceMain aufgeräumt,
danach die Prozedure verlassen und somit sollte der Service beendet sein, und das System kann
herunterfahren.
Delphi-Quellcode:
procedure ServiceHandler(fdwcontrol: integer); stdcall;
begin
case fdwcontrol of
SERVICE_CONTROL_STOP:
SERVICE_CONTROL_PAUSE:
SERVICE_CONTROL_CONTINUE:
SERVICE_CONTROL_INTERROGATE:
SERVICE_CONTROL_SHUTDOWN:
begin
if hStoppedEvent > 0 then SetEvent(hStoppedEvent);
end;
end;
end;
Versuch mal folgendes, um herauszufinden wo es genau hakt.
1. Testweise, ohne SERVICE_INTERACTIVE_PROCESS -> Reboot
2. Ohne das Aufräumen der Threads, bzw. gleich ohne diese überhaupt zu starten. -> Reboot
lg. Astat