Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#2

AW: Verständnisfrage zur Erstellung eines Dienstes

  Alt 27. Jul 2012, 11:49
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Jul 2012 um 12:08 Uhr)
  Mit Zitat antworten Zitat