Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Timer/Programm Priorität (https://www.delphipraxis.net/3550-timer-programm-prioritaet.html)

flomei 18. Mär 2003 15:29


Timer/Programm Priorität
 
Ich weiss, dass Timer eine sehr niedrige Priorität haben. Kann man das ändern? Stelle man sich folgendes vor: Der Timer muss sofort auf ein Ereignis reagieren. Manchmal dauert es ar***lange, bis mein Timer reagiert.
Oder überhaupt mein ganzes Programm. Das muss auch funktionieren, wenn mehrere Prozesse im Hintergrund laufen.
Man stelle sich folgendes vor: Ein Programm soll alles speichern, was geöffnet ist und dann den Rechner herunterfahren wenn der Lüfter kaputt ist und die CPU Temperatur sprunghaft ansteigt. Würde der Timer bei Vollauslastung auch nur zwei, drei Sekunden zu spät reagieren wäre vielleicht eine Menge Arbeit verloren und der Rechner kaputt. Das Programm hätte das vielleicht verhindern können. Ich hoffe jedem ist jetzt klar was ich mit Priorität meine.
Hat einer eine Idee?

Thx!

MfG Florian

Chriss 18. Mär 2003 18:21

ich weiss ja nicht, aber eigentlich sollte der rechner ausgehen, wenn die CPU ZU heiss wird, jedenfalls meine ich, dass so gelernt zu haben :wink:
was du aber noch willst ist, dass alles gespeichert wird...
WAS soll gespeichert werden?! einige Programme brauchen ihre Zeit, bis der Speichervorgang beendet ist, besonders bei aufwendigeren...

Luckie 18. Mär 2003 18:26

Re: Timer/Programm Priorität
 
Zitat:

Zitat von flomei
Ich weiss, dass Timer eine sehr niedrige Priorität haben. Kann man das ändern?

Nein. Und wenn, wüßte ich nicht wie.

Darty 18. Mär 2003 18:32

Kauf Dir einen Asus Board :) Der hat so ne C.O.P. Funktion der dann bei bestimmten Grad ausschaltet.
Aber nur damit ich jetzt besser verstehe. Timer haben niedrige Prioritäten ? Meinst du möchtest Dein Programm vor allen anderen Programmen die laufen als "wichtig" hinstellen oder ? Wenn ja, dann leiden die anderen Programmen aber darunter ..

Luckie 18. Mär 2003 18:41

Nein, das verhält sich so. Bei jedem Timer-Ereignis wird an das fenster ein WM_TIMER gesendet. Und diese Nachricht hat eine sehr niedriger Priorität in der Message-Queue. Wenn jetzt also noch andere Nachrichten anstehen, werden diese zu erst abgearbeitet und dann kommt WM_TIMER dran. Und wenn die anderen Nachrichten länger brauchen, um abgearbeitet zu werden, dann kann es schon mal dauern bis WM_TIMER abgearbeitet wird. Deswegen soll man WM_TIMER nie auf Gleichhiet mit einer Zeit prüfen, sondern immer mit größer.

Chewie 18. Mär 2003 18:45

Die Nachrichtenschleife eines Programmes wird doch von diesem selbst verwaltet. Also könnte man doch versuchen, eine WM_TIMER-Nachricht mit hoher Priorität zu bearbeiten und die übrigen auf einen zweiten Stapel legen, der nur bearbeitet wird, wenn keine Timer-Nachrichten vorliegen.

Luckie 18. Mär 2003 18:48

Das schon, nur wird die Nachrichtenschleife vom Fenster von der Nachrichtenschlange von Windows gefüttert.

Chewie 18. Mär 2003 18:52

Wenn man dem entsprechenden Programm nun eine hohe Prozesspriorität gibt, dann sollten doch auch Timer-Nachrichten recht zugig verschickt werden.

Luckie 18. Mär 2003 18:57

Nein.

Chewie 18. Mär 2003 19:11

Wieso nicht? Falls das heißen soll, Windows sortiert nicht nach Prozesspriorität sondern nach Typ der Nachricht, wofür gibt es dann die Prozesspriorität?
Oder sagt diese nur etwas über den Anzahl eines Prozesses an der Systemzeit aus, nicht aber über deren Behandlung in der Nachrichtenschleife von Windows?

Luckie 18. Mär 2003 19:14

Jupp. Die Priorität hat nur was mit der Zuteilung an Prozessorzeit zu tun. Da jedes Fenster seine eigene Nachrichtenschlange von Windows zugeteilt bekommt.

Chewie 18. Mär 2003 19:17

Dann ist das ganze ja doch kein so großes Problem. Das Programm, das schnell auf die Timer-Nachricht reagieren soll, darf ansonsten nur wenige Nachrichten bekommen, damit es schnell reagiert.

Luckie 18. Mär 2003 19:24

Wie willst du das verhindern? Was meinst du, was alles an dein Fenster gesendet wird, was du gar nicht mit bekommst.
WM_PAINT (dürfte am längsten dauern, da hier alles gezeichnet wird)
WM_ACTIVATE
WM_SIZE
WM_SIZING
WM_ACTIVATEAPP
WM_MOVE
WM_MOVING
WM_NCPAINT
WM_NCACTIVATE
WM_NCCALCSIZE
WM_WINDOWPOSCHANGED
WM_WINDOWPOSCHANGING
...
Um nur ein paar zu nennen.

Chewie 18. Mär 2003 20:16

Zunächst mal kein sichtbares Fenster. Dann fallen mal sämtliche WM_COMMAND weg; WM_PAINT etc., die vom System generiert werden, können ignoriert werden.
Wäre gut als Systemservice zu realisieren.


Man kann sich den ganzen Mist mit dem Timer abber auch sparen. Man braucht ja in Prinzip nur eine Aktion, die so oft wie möglich ausgeführt werden soll, nämlich die CPU-Temperatur zu überprüfen. Das dürfte sich auch mit einer Endlosschleife und Sleep- oder Delay-Commands, um die Auslastung zu verringern, bewerkstelligen lassen.

Luckie 18. Mär 2003 20:19

Spricht alles für einen Thread, denn man mit Sleep() zwischendurch schlafen schickt.

flomei 20. Mär 2003 08:44

Das mit dem Programm war nur ein Beispiel, um zu verdeutlichen was ich meine. Also sind und bleiben Timer-Prozesse "unwichtig".

Ist dann auch egal!

Thx!

MfG Florian


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 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