Bei uns sieht es so aus.
Delphi-Quellcode:
while not Terminated
do
try
ServiceThread.ProcessRequests(False);
Sleep(10);
except
on E:
Exception do begin
// Fehler loggen
end;
end;
Frag mich aber nicht, ob das Sleep wirklich nötig ist. Ich glaub das war mal drin, um die CPU-Last etwas zu begrenzen, falls ServiceThread.ProcessRequests genauso brutal reagiert, wie
Forms.Application.ProcessMessages
und die CPU voll auslastet, selbst wenn nix zu tun ist.
Bei inst sieht aber eigentlich so aus
Zitat:
while Assigned(Sender) and not Terminated do
und nach der Schleife kommt kein Code in der ServiceExecute vor.
Im ServiceCreate steht dann noch Folgendes, um den Service als normale "Anwendung" starten zu können und in Ruhe zu debuggen.
Delphi-Quellcode:
if IsDebuggerPresent
or FindCmdLineSwitch('
DEBUG', ['
-', '
/'], True)
then begin
Forms.Application.MainFormOnTaskBar := False;
// geht leider doch nicht ohne Form
Forms.Application.CreateForm(TForm, Temp);
// Form zum Beenden und für Eintrag in Taskbar
Temp.Caption := '
Debug-Mode: ' + SvcMgr.Application.Title;
Temp.OnCloseQuery := DebugServiceClose;
Temp.Visible := True;
{ SvcMgr.Application.Run; }
{}if FindCmdLineSwitch('
INSTALL', ['
-', '
/'], True)
then
{} TServiceApplicationHack(Application).RegisterServices(True, FindCmdLineSwitch('
SILENT', ['
-', '
/'], True))
{}else if FindCmdLineSwitch('
UNINSTALL', ['
-', '
/'], True)
then
{} TServiceApplicationHack(Application).RegisterServices(False, FindCmdLineSwitch('
SILENT', ['
-', '
/'], True))
{}else begin
{} Started := True;
{} ServiceStart(Self, Started);
{} if Started
then begin
{} ServiceExecute(
nil);
{} while not Terminated
do
{} try
{} Forms.Application.ProcessMessages;
{} Sleep(10);
{} except
{} on E:
Exception do begin
{} DM1.LogEvent('
ServiceExecute: es ist ein nicht abgefangener Fehler aufgetreten', E);
{} Sleep(1000);
{} end;
{} end;
{} end;
{} Forms.Application.Terminate;
{}end;
end;