AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dienst, Sleep oder Timer

Ein Thema von hoika · begonnen am 10. Nov 2006 · letzter Beitrag vom 14. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2      
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#1

Dienst, Sleep oder Timer

  Alt 10. Nov 2006, 18:04
Hallo #,

nun muss ich bald mit einer Dienstprogrammierung anfangen,
die Tutorials habe ich schon gelesen

Aber eine Frage habe ich noch.
Jede x Minute soll der Dienst etwas machen
(eventuell geänderte Konfigurationsdaten auslesen)
Dazu macht er ein Connect, kuckt nach
und das wars.

Sollte man dazu Sleep oder einen Timer verwenden ?
Es gab doch mal so ein Problem mit 100% CPU-Auslastung.


Heiko
Heiko
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Dienst, Sleep oder Timer

  Alt 12. Nov 2006, 09:03
Zitat von hoika:
Sollte man dazu Sleep oder einen Timer verwenden ?
Es gab doch mal so ein Problem mit 100% CPU-Auslastung.
Hi,
ich glaube das mit der 100% CPU Last war ein anderes Warten. Mal kurz zur Theorie, wenn du sleep benutzt, dann legst du den aufrufenden Prozess schlafen. Ist dies der Hauptprozess, so reagiert dieser für die Dauer des sleep auf gar nichts mehr. Da werden keine Botschaften entgegen genommen und auf nichts reagiert. Hast du ein normales Programm (mit Fenster), so lässt sich hier kein Element mehr bedienen und kein Formular mehr verschieben oder schließen, bis das sleep verlassen wird.
Eine Alternative dazu bestand immer darin, dass du in einer Schleife wartest. Einfachste Möglichkeit ist es dabei, dass du dir den aktuellen Zeitpunkt t1 nimmst (GetTickCount), in eine leere while Schleife gehst, die erst beendet wird, wenn die nun aktuelle Zeit - t1 größer ist als ein bestimmtes Interval. Das Interval ist dann natürlich deine Wartezeit.
Dabei wird dein Programm diese Schleife aber mit der ihm zur Verfügung stehenden Leistung ausführen, dass können schnell 100% CPU Last sein. Dein Programm bekommt so zwar noch Änderungen mit, allerdings bleibt leider keine Zeit darauf zu reagieren. Der nächste Schritt bestand dann häufig darin, dass man in den Schleifenkörper ein Application.ProcessMessages aufnahm. Das ganze hat dann den Vorteil, dass alle Nachrichten abgearbeitet werden können, die Last der CPU sinkt, Fenster lassen sich verschieben, aber es ist und bleibt einfach Polling. Du schaust (völlig unnötig) ständig nach ob etwas passiert ist (Zeit abgelaufen) und reagierst dann wenn es soweit ist.
Auch dazu gab es dann noch eine Alternative, die um einiges Eleganter vorgeht. Die solltest du per Forensuche nach Delay (evtl. in der Codelib?) finden. Die Idee dort ist es, dass du auf ein bestimmtes Signal wartest. Dies unterstützt Windows direkt. Du kannst dabei auf die Ankunft eines Signals warten. Solange wird dein Prozess schlafen gelegt. Wird das Signal gesetzt, wird dein Prozess wieder aufgeweckt und ihm das Ereignis mitgeteilt. Die entsprechende Windows-Funktion hat aber zwei weitere Abbruchbedingungen. Die eine besteht in einem Timeout. Hier kannst du eine Zeit festlegen, nachder ein Timeout signalisiert wird. Tritt dieses ein, ist der Rückgabewert der Funktion entsprechend. Reagierst du nur auf dieses Signal, hast du einen sehr schönen Timer, der aut. benachrichtigt wird, wenn die Zeit abgelaufen ist. Hier ist kein Polling nötig! Der Prozess wird echt schlafen gelegt (kann z.B. auf Laptops zu einem günstigeren Energiezustand führen). Jetzt bleibt noch das Problem, dass die Fenster verschoben werden könnten, solange der Prozess schläft kann er nicht darauf reagieren. Deswegen ist in dieser Delay-Funktion noch eine weitere Bedingung drin, die den Prozess aufweckt, dass eintreffen von Windows-Botschaften. Auch hier wird der schlafende Prozess geweckt, die Botschaften abgearbeitet und der Prozess für die restliche Zeit (bis zum ursprünglichen Timeout) wieder schlafen gelegt.

Der Unterschied zum Timer besteht in den Lösungen die ich hier bisher erwähnte vorallem darin, dass du direkt an einer Stelle im Code (zwischen zwei Anweisungen) warten kannst. Ein Timer löst eine bestimmte Behandlung aus, wenn sein Interval um ist, möchtest du aber eine bestimmte Zeit zwischen zwei Anweisungen warten, so musst du hier im COde auf diesen Timer synchronisieren. Bei dir sollte das weniger problematisch sein (da kommst du denke ich mit einem Timer aus). Aber ein Timer hat noch einen wichtigen Nachteil, die Genauigkeit. Der Timer läuft nicht mit all zu hoher Priorität. Es kann also bei hoher Last des Systems auch mal dazu kommen, dass das Timer-Ereignis nicht ausgelöst wird. Sollte selten oder nie der Fall sein, kann aber imo passieren (glaube mich zu erinnern, dass es durchaus bei einigen passiert ist).

Gruß Der Unwissende
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Dienst, Sleep oder Timer

  Alt 13. Nov 2006, 08:02
Puh,
vie Code eh Text

das Delay hatte ich schon gefunden,
mein Dienst soll ja zwischendurch nix tun.
Fenster gibt es auch nicht.

Danke


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#4

Re: Dienst, Sleep oder Timer

  Alt 13. Nov 2006, 08:46
Zitat von hoika:
Sollte man dazu Sleep oder einen Timer verwenden ?
Es gab doch mal so ein Problem mit 100% CPU-Auslastung.
Du meinst sicher diesen Thread.
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Dienst, Sleep oder Timer

  Alt 13. Nov 2006, 08:53
Zitat von hoika:
das Delay hatte ich schon gefunden,
mein Dienst soll ja zwischendurch nix tun.
Fenster gibt es auch nicht.
ich würde Dir trotzdem das Delay vorschlagen.
Es schadet nicht und vielleicht willst Du den Dienst später mal erweitern...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: Dienst, Sleep oder Timer

  Alt 13. Nov 2006, 09:32
also ich hab derletzt auch so ein ähnliches programm gemacht (allerdings mit form)

beim start lass ich einmal das programm komplett durchlaufen und errechne mir dabei
die startzeit für meinen nächsten lauf...
anschließend vergleiche ich über einen timer aktuelle und start zeit, wenn beide gleich
sind lass ich alle prozeduren wieder laufen und errechne mir erneut die startzeit für denn
nächsten lauf...
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

Re: Dienst, Sleep oder Timer

  Alt 13. Nov 2006, 09:48
mir is gerade bei meinem prog noch was zur cpu auslastung eingefallen...

die liegt bei meiner timer lösung unter 1%
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Dienst, Sleep oder Timer

  Alt 13. Nov 2006, 09:55
Hi,
was den Timer angeht, so ist das ja auch keine Lösung von der bisher gänzlich abgeraten wurde. Um es kurz zu machen, klar, sie funktioniert. Aber es gibt ein paar Dinge die für diese Lösung gelten. Das wichtigste ist, dass du dabei nur direkt das eintretende Ereignis behandelst. Sagen wir mal du möchtest einen Befehl wegschicken (Schnittstelle ist egal) und max. delta t auf eine Antwort warten. Kam die Antwort nicht innerhalb von t ms, so verschickst du die Anfrage nochmal. Könntest ja z.B. versuchen TCP zu implementieren. Mit einem Timer ist soetwas nicht wirklich möglich. Du musst hier schließlich auf eine direkte Antwort warten, diese also dem Gesendeten zuordnen können. Natürlich kannst du hier warten und über den Timer ein Flag setzen und den Timer beenden, wenn die Antwort vorher kommt, aber es ist halt ein Umweg, der mit dem Delay nicht nötig ist.
Zudem bleibt halt dein Ereignis vom Timer abhängig. Laufen genug andere Prozesse mit hoher Last, wird dein Timer halt mal nicht ausgelöst. Kann ja eventuell auch kritische Folgen haben.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

Re: Dienst, Sleep oder Timer

  Alt 13. Nov 2006, 10:14
Zitat von Der_Unwissende:
Zudem bleibt halt dein Ereignis vom Timer abhängig. Laufen genug andere Prozesse mit hoher Last, wird dein Timer halt mal nicht ausgelöst. Kann ja eventuell auch kritische Folgen haben.
ok, der timer ist von einem ereigniss abhängig, aber das mit dem auslösen würd ich in frage stellen, uns server ist gut ausgelastet und der timer hat trotzdem keine probleme...
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: Dienst, Sleep oder Timer

  Alt 13. Nov 2006, 10:17
Ich meinte auch nur, dass es (soviel ich weiß) dazu kommen kann. Das schlimme ist ja gerade, dass ein Timer Ereignis unbemerkt ausgelassen werden kann (während andere eintreten).
Andererseits, wenn euer Server dauerhaft auf 100% Last läuft, dann habt ihr eh andere Sorgen

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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