Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Systemdienst stresst CPU (https://www.delphipraxis.net/86617-systemdienst-stresst-cpu.html)

RolfPolf 16. Feb 2007 11:26


Systemdienst stresst CPU
 
Hallo,
ich wage mich zum ersten Mal an Dienste heran und habe dazu mal alles was ich so an Tutorials und Foreneintragen gefunden habe abgegrast. Die ersten Testbeispiele funktionieren soweit auch (z.B.: dieses).

Jetzt habe ich mal ein ganz simples Bsp selber erstellt, welches über einen TTimer verfügt der alle x Sekunden eine Logdatei aktualisiert. Wenn ich den Dienst so starte, dann wird er nach dem Start sofort wieder beendet, weil er sich im Leerlauf befindet. Deshalb habe ich dann die folgende Ereignisprozedur eingebaut:

Delphi-Quellcode:
procedure TService1.ServiceExecute(Sender: TService);
begin
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False);
  end;
end;
Die läuft auch, allerdings verursacht dieser Dienst dann mal permanent 50% CPU-Auslastung.
OK, die while-Schleife ist dafür verantwortlich. Lässt man sie allerdings weg, dann wird der Dienst nach dem Start auch sofort wieder beendet, weil er sich wieder im Leerlauf befindet. Wenn ich ihn in der While-Schleife mit Sleep schlafen lege, dann kann er nicht mehr beendet werden.

Ist es tatsächlich erforderlich, einen eigenen Thread zu erzeugen wenn man nur einen Dienst haben möchte, der alle 10 Sekunden eine Prozedur aufruft ohne dabei die CPU auszulasten? Oder wo ist da mein Denkfehler?
Danke für ein "auf die Sprünge helfen",
RolfPolf

ste_ett 16. Feb 2007 11:30

Re: Systemdienst stresst CPU
 
Delphi-Quellcode:
procedure TService1.ServiceExecute(Sender: TService);
begin
  while not Terminated do
  begin
    Sleep(100);
    ServiceThread.ProcessRequests(False);
  end;
end;
Bau ein "Sleep()" ein. :)

Matze 16. Feb 2007 11:33

Re: Systemdienst stresst CPU
 
@ste_ett:

Zitat:

Zitat von RolfPolf
Wenn ich ihn in der While-Schleife mit Sleep schlafen lege, dann kann er nicht mehr beendet werden.

Du könntest es mit DelayDelay versuchen.

f.siebler 16. Feb 2007 11:43

Re: Systemdienst stresst CPU
 
hi,
ich glaube es gibt da von luckie eine gute Anleitung, ansonsten mal bei den Schweizern schauen...., aber ich glaube du musst lediglich beim start vom Dienst eine Rückmeldung an das System geben, das "sich was tut", dann wird der dienst auch nicht beendet. mit welcher delphi version arbeitest du? hinweiß z.b. delphi 5 dienste laufen unter windows 2003 server nicht ohne weiteres...

RolfPolf 16. Feb 2007 11:47

Re: Systemdienst stresst CPU
 
Zitat:

Zitat von Matze
Du könntest es mit DelayDelay versuchen.

Danke erstmal, aber Delay verwendet Application.ProcessMessages, und das gibts nur bei GUI-Anwendungen und nicht bei Diensten...

Zitat:

Zitat von ste_ett
Bau ein "Sleep()" ein.

Auch danke, aber wie bereits geschrieben: Dann lässt sich der Dienst nicht mehr beenden, bzw. nur wenn man zufällig einen nicht-Sleep-Moment erwischt.

RolfPolf 16. Feb 2007 11:56

Re: Systemdienst stresst CPU
 
Zitat:

Zitat von f.siebler
hi,
ich glaube es gibt da von luckie eine gute Anleitung, ansonsten mal bei den Schweizern schauen...., aber ich glaube du musst lediglich beim start vom Dienst eine Rückmeldung an das System geben, das "sich was tut", dann wird der dienst auch nicht beendet. mit welcher delphi version arbeitest du? hinweiß z.b. delphi 5 dienste laufen unter windows 2003 server nicht ohne weiteres...

Ich arbeite mit Delphi7, sollte also nicht das Problem sein. Irgend eine Idee, wie diese Rückmeldung aussehen kann? Bei den Schweizern habe ich nur Threads ohne Lösung für die gleiche Problematik gefunden.

hoika 16. Feb 2007 12:51

Re: Systemdienst stresst CPU
 
Hallo,

siehe http://www.delphipraxis.net/internal...ect.php?t=7355

Das mit dem Delay und kann Dienst nicht beenden,
kann ich nicht nachvollziehen.
Delay(100) sind 100 ms, so schnell kannst du gar nicht blinzeln ;)


Heiko

RolfPolf 16. Feb 2007 13:02

Re: Systemdienst stresst CPU
 
Zitat:

Zitat von hoika
Hallo,

siehe http://www.delphipraxis.net/internal...ect.php?t=7355

Das mit dem Delay und kann Dienst nicht beenden,
kann ich nicht nachvollziehen.
Delay(100) sind 100 ms, so schnell kannst du gar nicht blinzeln ;)


Heiko

Zitat:

Zitat von RolfPolf
Danke erstmal, aber Delay verwendet Application.ProcessMessages, und das gibts nur bei GUI-Anwendungen und nicht bei Diensten...


pertzschc 16. Feb 2007 13:13

Re: Systemdienst stresst CPU
 
Hi,

bei mir ist die Methode so implementiert und es gibt 0% Auslastung solange auf einem TCP Port für den Dienst nichts hereinkommt (er quasi im Leerlauf ist).

Delphi-Quellcode:
procedure TPTSService.ServiceExecute(Sender: TService);
begin
   // main schleife
   while not Terminated do
   begin
      ServiceThread.ProcessRequests(True);
   end;
end;
Gruß,
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz