Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)? (https://www.delphipraxis.net/124535-gibt-es-eine-message-bei-uhrzeit-aenderung-jede-sekunde.html)

DerDan 20. Nov 2008 16:15


gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)?
 
Hallo,


gibt es eine Windows Message bei jeder Uhrzeit Änderung (jede Sekunde)?

ich möchte nicht 10 mal die Sekunde pollen ob sich die Uhrzeit geändert hat, sondern immer dann, wenn sich die Sekunden änderen eine Windows Botschaft.

Gibt es sowas? Kann man sowas selber machen?


mfg


DerDan

scrat1979 20. Nov 2008 16:20

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Ich würde einen Timer erstellen und im OnTimer-Ereignis prüfen, ob sich seit dem letzten Event die Uhrzeit geändert hat. Was anderes fällt mir hierzu nicht ein. Je nach benötigter Genauigkeit kann man das Timer-Intervall auch entsprechend erhöhen.

mkinzler 20. Nov 2008 16:23

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Dann wären die Hardwareanforderungen von Windows noch höher

Matze 20. Nov 2008 16:28

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Hallo DerDan,

welcher tiefere Sinn liegt denn dahinter?
Da mir keine sinnvolle Anwendung einfällt, vermute ich, dass es eine bessere Lösung gibt.

Grüße, Matze

mkinzler 20. Nov 2008 16:30

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Wenn es um eine genaue Taktung geht GetTickCount()

DerDan 20. Nov 2008 16:38

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von Matze
Hallo DerDan,

welcher tiefere Sinn liegt denn dahinter?
Da mir keine sinnvolle Anwendung einfällt, vermute ich, dass es eine bessere Lösung gibt.

Grüße, Matze

Das ist ja lustig, wie lange hast du denn nachgedacht.
Spaß beiseite.

Ich möchte die Sekunden - genaue Uhrzeit in einem Fenster darstellen.

Wenn man sich nun die analoge Uhr anschaut, die bei Windows mitgeliefert wird, dann fällt dort auf das der Sekundenzeiger nicht genau jede Sekunde weiterwandert. manchmal "hängt" der Zeige eine kurze Weile.
-> Einfach mal eine Weile beobachten.

ich denke dieser Effekt, kommt daher, dass man die Uhrzeit in festen Abständen abfrägt und vergleicht.

Diesen Effekt möchte ich vermeiden.

Gibt es weitere Vorschläge?


mfg

DerDan

DerDan 20. Nov 2008 16:40

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von mkinzler
Wenn es um eine genaue Taktung geht GetTickCount()

Hallo,


ist GetTickCount() eine Message?


mfg

DerDan

Cyf 20. Nov 2008 16:53

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Wenn es nicht um absolute Genauigkeit geht, würd ich auch sagen, am einfachsten wäre OnTimer oder eine Schleife mit GetTickCount und Sleep(1000).

DerDan 20. Nov 2008 16:55

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von Cyf
Wenn es nicht um absolute Genauigkeit geht, würd ich auch sagen, am einfachsten wäre OnTimer oder eine Schleife mit GetTickCount und Sleep(1000).

Pollen ist genau das, was ich nicht möchte. Warum hab ich weiter oben erklärt.


mfg

DerDan

Chemiker 20. Nov 2008 17:27

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Hallo DerDan,

für Zeitmessungen benutze ich

Delphi-Quellcode:
QueryPerformanceFrequency(T11);
QueryPerformanceCounter(T12);
Sind wesentlich genauer als GetTickCount.

Vielleicht solltest Du mal unter Multimedia-Timer suchen und evt. direkt die API-Programmieren.

Bis bald Chemiker

mkinzler 20. Nov 2008 17:42

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Da es ihm nur um Sekunden geht, sollte es aber reichen

jfheins 20. Nov 2008 17:52

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Du könntest die momentane Zeit abfragen, und dann einen Timer starten mit dem Intervall 1000-Millisekunden der also ungefähr dann auslöst, wenn der nächste sekundensprung erfolgt. Dann einfach im OnTimerEvent wiederum das Intervall setzen ...

Rein aus Interesse: Ich habe bereits 2 Uhren (Tna+Sidebar) beide zeigen nur die Minute an, und auch die Windowsuhr "ruckelt". Ist es wirlich so schlimm, wenn die Sekundenzeiger nicht perfekt synchron sind?

Cyf 20. Nov 2008 17:52

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von DerDan
Zitat:

Zitat von Cyf
Wenn es nicht um absolute Genauigkeit geht, würd ich auch sagen, am einfachsten wäre OnTimer oder eine Schleife mit GetTickCount und Sleep(1000).

Pollen ist genau das, was ich nicht möchte. Warum hab ich weiter oben erklärt.


mfg

DerDan

Imho wird es keine andere Möglichkeit geben, es ist mir auch nicht gelungen, dass hängen des Uhrzeigers zu reproduzieren (Vista). Ich verstehe nicht ganz, wo bei solchen Anwendungen das Problem liegt, das ganze per Timer oder Sleep (eventuel mit entsprechend kleinerem Zeitintervall, das Teiler des Zeitintervalls ist) zu machen. An jede Anwendung jede Sekunde eine Message zu schicken, wäre für Windows auch nicht sehr performant. Probleme könnte es hier nur bei Intervallen <50 ms geben.
Sollten die Ungenauigkeiten zu groß werden, kann man immernoch QP-Counter verwenden und/oder timebased movement.

alzaimar 20. Nov 2008 18:01

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Ein Timer mit einem Interval von 1000ms ist "ungenau", denn dann könnte der Sekundenzeiger 1,9883 Sekunden hängen, um danach -hüpf-hüpf- zwei Striche innerhalb von +/-100ms weiterzuhüpfen. Abhilfe: Alle 200ms prüfen.

Du kannst das natürlich auch mit einem Thread lösen, der per sleep(100) die Zeit prüft und nach Sekundenwechsel ein Event auslöst (oder von mir aus eine Message).

Falls das keine sportiliche Übung ist, würde ich mir über den sin einers 'echten' Sekundenzeigers mal Gedanken machen.

Chemiker 20. Nov 2008 18:21

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Hallo,

für die Anzeige einer Uhr finde ich ist es eigentlich ausreichend mit einem Timer zu arbeiten.

Bis bald Chemiker

Cyf 20. Nov 2008 18:30

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von alzaimar
Ein Timer mit einem Interval von 1000ms ist "ungenau", denn dann könnte der Sekundenzeiger 1,9883 Sekunden hängen, um danach -hüpf-hüpf- zwei Striche innerhalb von +/-100ms weiterzuhüpfen. Abhilfe: Alle 200ms prüfen.

Zitat:

(eventuell mit entsprechend kleinerem Zeitintervall, das Teiler des Zeitintervalls ist)
Zitat:

Zitat von alzaimar
Event auslöst (oder von mir aus eine Message).

Messages sind hier eigentlich keine gute Idee, da man ja nicht versprechen kann, dass eine solche Message auch sofort ausgewertet wird, was nützt es in einer Funktion außerhalb der Message-Schleife zu stecken und dann 3x eine "Sekunde rum"-Nachricht zu erhalten. (selbes gilt natürlich auch für das Timer-Event klar, am Ende läuft alles sowieso drauf raus, irgendwo in einer Schleife zu prüfen) :wink:

alzaimar 20. Nov 2008 18:34

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Er wollte eine Message, also kann er sich eine basteln. Wir sind doch hier generös, gell? :mrgreen:

Aber Dein Einwand ist korrekt.

Edit: Die Lösungsvorschläge erinnern mich langsam an den 'Zahlen negieren' Thread.

nahpets 21. Nov 2008 09:12

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Hallo,

schau mal hier in Post #13, damit solltest Du Dir einen Timer zusammenbasteln können, der eine Genauigkeit von 1 Millisekunde erreicht.

Reinhard Kern 21. Nov 2008 10:08

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von DerDan
...
Pollen ist genau das, was ich nicht möchte. Warum hab ich weiter oben erklärt.

Hallo,

Pollen ist natürlich genauso "unelegant" wie ein Versenden einer Sekunden-Message an alle Anwendungen. Wenn du das aber ernsthaft vermeiden willst, musst du wohl in die Treiberprogrammierung von Windows einsteigen und das Uhrzeitsystem soweit modifizieren, dass es deinem Programm (!) eine entsprechende hochpriorisierte Message schickt, wenn die Sekunde wechselt. Das läuft mehr oder weniger darauf hinaus, Windows zumindest teilsweise in ein Echtzeitsystem umzubauen, dafür haben manche Firmen mit hochqualifizierten Leuten schon Mann-Jahrzehnte investiert. Sonst würde nämlich immer wieder mal ein I/O das zeitgenaue Absenden der Message ebenso wie den Empfang blockieren.

Ich schätze dass der Aufwand durchaus im Bereich von Mio EUR liegt. Ob das eine genaue Sekundenanzeige wert ist? Ich würde mir eine Funkuhr kaufen (nicht jede hat so eine genaue Sekundenanzeige!).

Gruss Reinhard

PS die Erfahrungen mit Echtzeit und Windows zeigen, dass man eine genaue Sekundensoftware besser ganz aus Windows mit seinen Messages herausnimmt und nur auf der Echtzeitebene behandelt.

himitsu 21. Nov 2008 10:16

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Ein Timer auf 1000m macht sich nicht so gut, für die sekundengenaue Darstellung, da so ja mal eine Sekunde übergangen werden kann (Timer, GetTickCount und Co. arbeiten ja ungenau).

Aber ein Timer auf 100 oder 200 MS verbraucht erstmal nicht viele Systemresoursen und für das menschliche Gefühl, fällt eine Verzögerung von diesen Zeiten kaum auf.

SirThornberry 21. Nov 2008 10:24

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Ohne pollen geht es definitiv nicht, also einfach einen recht kleinen Interval nehmen.
Wie bereits gesagt wurde: Selbst wenn es eine Message geben würde, wäre es auch ein Pollen weil die Nachrichten ja per Polling abgeholt werden.

himitsu 21. Nov 2008 10:36

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von SirThornberry
Wie bereits gesagt wurde: Selbst wenn es eine Message geben würde, wäre es auch ein Pollen weil die Nachrichten ja per Polling abgeholt werden.

Außerdem wäre es so noch belastender für das System, denn nicht jede Anwendung braucht soeine Nachricht, aber wenn die vom System versendet würd, dann würden alle Anwendungen damit belastet (lso alle Anwendungen, welche diese Nachricht verarbeiten müssen, anstatt nur deiner, wenn du einen Timer verwendest)

DerDan 21. Nov 2008 11:25

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Okay,


vielen Dank soweit.

Die Lösungsvorschläge sind ja alle in etwa gleich. Und meine ursprüngliche Frage, ob es sowas schon gibt ganz klar mit einem Nein beantwortet.

Vielen Dank nochmals.


Ein paar Kommentare hab ich aber noch:

1)
Unter der Annahme das jede Applikation sowieso jede Menge Messages bekommt, geh ich mal davon aus, das eine nicht weiter ausgewertet "Sekunden Message" andere Applikationen auch nicht so wahnsinnig belasten würden.

2)
Bei einigen Windows Botschaften muss man sich erst anmelden damit man entsprechend Messages bekommt. Hätte ja sein können, dass es sowas für Sekunden auch gibt.

3)
Falls ich mir mit Sleep eine Thread - Schleife basteln würde, dann würde ich es etwa so lösen:

Delphi-Quellcode:
while not abort do
begin
  if TimeSekChanged() then
  begin
    SendMEssage (...)
    Sleep (900);
  end else begin
    Sleep (50);
  end;
end;

mfg DerDan und nochmal vielen Dank

mkinzler 21. Nov 2008 11:33

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Da stellt sich doch nur dier Frage, ob dir dein Rechner wirklich zu schnell ist und du auf Teufel-komm-raus ein solche Performancekillende Lösung bevorzugst :gruebel:

nahpets 21. Nov 2008 11:46

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Hallo,
Zitat:

Zitat von SirThornberry
Ohne pollen geht es definitiv nicht, also einfach einen recht kleinen Interval nehmen.
Wie bereits gesagt wurde: Selbst wenn es eine Message geben würde, wäre es auch ein Pollen weil die Nachrichten ja per Polling abgeholt werden.

wieso nicht?

Ein paar Konstanten für definierte Zeiträume
Delphi-Quellcode:
const
  iOneSecond     : Integer =    1000; // eine Sekunde in Millisekunden
  iOneMinute     : Integer =   60000; // eine Minute in Millisekunden
  iFiveMinutes   : Integer =  300000; // Fünf Minuten in Millisekunden
  iFifteenMinutes : Integer =  900000; // Fünfzehn Minuten in Millisekunden
  iOneHour       : Integer = 3600000; // Eine Stunde in Millisekunden
  iOneDay        : Integer = 86400000; // Ein Tag in Millisekunden
Eine Funktion zum Berechnen der Zeitdifferenz bis zum nächsten Timerereignis.
Hier wird der Wert berechnet, der Interval zuzuweisen ist, bevor der Timer eingeschaltet wird.
iTimerInterval kann einer der obigen Konstanten Werte sein oder was, was man selbst berechnet.
Delphi-Quellcode:
function CalcTimerInterval(iTimerInterval : Integer) : Integer;
Var
          dNow : Double;
begin
  // Interval setzen
  // Tagesdatum und Uhrzeit holen
  dNow := Now;
  // Den Tagesanteil holen (= Nachkommastellen).
  dNow := dNow - Trunc(dNow);
  // Rest bis Mitternacht holen.
  dNow := 1 - dNow;
  // Nachkommastellen mal Millisekunden pro Tag
  Result := Trunc(dNow * iOneDay);
  // wir benötigen den Rest bis zum angegeben Interval, damit der Timer
  // zur nächsten Minute, Stunde, 0 Uhr ... aktive wird.
  Result := (Result mod iTimerInterval);
end;
Uhrzeit lesen und Millisekunden bis zur nächsten vollen Sekunde berechnen, kann doch garnicht so schwer sein?
Delphi-Quellcode:
Timer.Enabled := False;
// Schiebe Zeiger eine Position weiter:
Timer.Interval := CalcTimerInterval(iOneSecond);
Timer.Enabled := True;

DerDan 21. Nov 2008 11:58

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von mkinzler
Da stellt sich doch nur dier Frage, ob dir dein Rechner wirklich zu schnell ist und du auf Teufel-komm-raus ein solche Performancekillende Lösung bevorzugst :gruebel:

Wo wird Performance gekillt?

Sherlock 21. Nov 2008 12:06

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Im sleep?

Sherlock

DerDan 21. Nov 2008 12:09

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von Sherlock
Im sleep?

Sherlock


Und wieso?

Hast du schon mal gelesen, was
Delphi-Quellcode:
sleep
macht?


mfg DerDan

Sherlock 21. Nov 2008 13:11

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
:oops:

Aber wofür brauchst Du SendMessage? Weil Du unbedingt auf eine Message reagieren musst, auch wenn Sie von Dir selbst stammt? Im eigenen Code kannst Du doch einfach die Routine aufrufen, die auf eine Zeitänderung reagieren soll. Das sollte deutlich schneller gehen, als über Messages.

Sherlock

Macci 22. Nov 2008 02:42

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Hi,

klar kannst du Windows dazu veranlassen, deinem Programm jede Sekunde eine Message zu schicken.

Das Zauberwort heisst "SetTimer". Du erhältst dann Messages des Typs WM_TIMER von Windows. (Nicht zu verwechseln mit dem Timer-Steuerelement von Delphi).

Hier ein Beispiel in C aus dem Buch "Windows Programmierung":


Code:
/*-----------------------------------------
   BEEPER1.C - Timer-Demo Nummer 1
                 (c) Charles Petzold, 1998
  -----------------------------------------*/


#include <windows.h>

#define ID_TIMER   1

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("Beeper1") ;
     HWND        hwnd ;
     MSG         msg ;
     WNDCLASS    wndclass ;
     
     wndclass.style        = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc  = WndProc ;
     wndclass.cbClsExtra   = 0 ;
     wndclass.cbWndExtra   = 0 ;
     wndclass.hInstance    = hInstance ;
     wndclass.hIcon        = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName = NULL ;
     wndclass.lpszClassName = szAppName ;
     
     if (!RegisterClass (&wndclass))
     {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit
          MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("Beeper1 (Timer-Demo)"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
         
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
         
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static BOOL fFlipFlop = FALSE ;
     HBRUSH     hBrush ;
     HDC        hdc ;
     PAINTSTRUCT ps ;
     RECT       rc ;
     
     switch (message)
     {
     case WM_CREATE:
          SetTimer (hwnd, ID_TIMER, 1000, NULL) ;
          return 0 ;

     case WM_TIMER :
          MessageBeep (-1) ;        
          fFlipFlop = !fFlipFlop ;
          InvalidateRect (hwnd, NULL, FALSE) ;
          return 0 ;
         
     case WM_PAINT :
          hdc = BeginPaint (hwnd, &ps) ;
         
          GetClientRect (hwnd, &rc) ;
          hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ;
          FillRect (hdc, &rc, hBrush) ;

          EndPaint (hwnd, &ps) ;
          DeleteObject (hBrush) ;
          return 0 ;
         
     case WM_DESTROY :
          KillTimer (hwnd, ID_TIMER) ;
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

jfheins 22. Nov 2008 09:55

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von Macci
Hi,

klar kannst du Windows dazu veranlassen, deinem Programm jede Sekunde eine Message zu schicken.

Das Zauberwort heisst "SetTimer". Du erhältst dann Messages des Typs WM_TIMER von Windows. (Nicht zu verwechseln mit dem Timer-Steuerelement von Delphi).

Ähh .. natürlich nicht zu verwechseln ... denn es ist ja das gleiche in Grün, nur einmal als Klasse gekapselt und einmal nicht :mrgreen:

Außerdem sorgt der Timer ja nicht (wie gewünscht) dass bei jedem Sekundenwechsel eine Message gesendet wird, sondern nur sekündlich. Bei letzerem bleibt eben immer ein Offset von bis zu knapp unter einer Sekunde ;)

Macci 22. Nov 2008 14:34

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von jfheins
Außerdem sorgt der Timer ja nicht (wie gewünscht) dass bei jedem Sekundenwechsel eine Message gesendet wird, sondern nur sekündlich. Bei letzerem bleibt eben immer ein Offset von bis zu knapp unter einer Sekunde ;)

Hmm okay.. am besten wäre es dann wohl, einen Timer mit einem kurzen Zeitintervall zu starten (z.B. 10 ms) und sich die letzte Uhrzeit immer zu merken. Auf diese Weise wäre die Verzögerung weniger als 1/100-Sekunde, und somit von keinem Menschen bemerkbar. Über Performace bräuchtest du dir da auch keine Gedanken machen, denn 100 Messages pro Sekunde entsprechen einer CPU-Last von 0,0% (gerundet) ;-)

Viele Gruesse,
Macci

DerDan 22. Nov 2008 15:13

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von Macci
Zitat:

Zitat von jfheins
Außerdem sorgt der Timer ja nicht (wie gewünscht) dass bei jedem Sekundenwechsel eine Message gesendet wird, sondern nur sekündlich. Bei letzerem bleibt eben immer ein Offset von bis zu knapp unter einer Sekunde ;)

Hmm okay.. am besten wäre es dann wohl, einen Timer mit einem kurzen Zeitintervall zu starten (z.B. 10 ms) und sich die letzte Uhrzeit immer zu merken. Auf diese Weise wäre die Verzögerung weniger als 1/100-Sekunde, und somit von keinem Menschen bemerkbar. Über Performace bräuchtest du dir da auch keine Gedanken machen, denn 100 Messages pro Sekunde entsprechen einer CPU-Last von 0,0% (gerundet) ;-)

Viele Gruesse,
Macci

Wobei ich dann fast wieder bei meiner Lösung bin. Beitrag 23

Vielen Dank

himitsu 25. Nov 2008 11:25

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
nochmal kurz zu
Zitat:

Zitat von Macci
(Nicht zu verwechseln mit dem Timer-Steuerelement von Delphi)

Code:
procedure TTimer.UpdateTimer;
begin
  [b]KillTimer[/b](FWindowHandle, 1);
  if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then
    if [b]SetTimer[/b](FWindowHandle, 1, FInterval, nil) = 0 then
      raise EOutOfResources.Create(SNoTimers);
end;
Ja und es wird nicht jede Sekunde das Event ausgelöst ... wenn dein Programm z.B. 10 Sekunden lang seine Nachrichten (Messages) nicht bearbeitet, dann sind nicht (wie man vielleicht denken könnte) auch 10 Timer-Nachrichten in der Liste, sondern nur eine.

Auserdem arbeitet Windows ja nicht genau und es kommt nicht aller "genau" 'ner Sekunde ein Ereignis rein (wenn windows oder ein Programm aus-/überlastet ist, dann kann es auch mal verspätet eintreffen)

sirius 25. Nov 2008 11:49

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Also ich wäre ja bei folgender Überlegung stutzig geworden:
Zitat:

Zitat von DerDan
Wenn man sich nun die analoge Uhr anschaut, die bei Windows mitgeliefert wird, dann fällt dort auf das der Sekundenzeiger nicht genau jede Sekunde weiterwandert. manchmal "hängt" der Zeige eine kurze Weile.
-> Einfach mal eine Weile beobachten.

Dann hätte ich mir gedacht, dass, wenn Microsoft keine sekundengenaue Uhr in seine GUI: Windows einbaut, dann wird es wohl tief im Inneren von Windows auch keine dementsprechende Möglichkeit (oder Message) geben. :zwinker:

himitsu 25. Nov 2008 11:58

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von sirius
Dann hätte ich mir gedacht, dass, wenn Microsoft keine sekundengenaue Uhr in seine GUI: Windows einbaut, dann wird es wohl tief im Inneren von Windows auch keine dementsprechende Möglichkeit (oder Message) geben. :zwinker:

Das hängt aber auch noch damit zusammen, daß der Prozess, welcher unter Anderem die Uhr zeichnet,
mit einer geringen Prozesspriorität läuft, da sie ja anderen Programmen nicht viel Rechnenleistung klauen soll ... somit bleibt sie auch schonmal Minutenlang stehen, wenn der PC ausgelastet ist.

Mit einer hohen Prozess-/Threadpriorität und einem HighRessolutionTimer (Bei Google suchenMultimediatimer/Hier im Forum suchenMultimediatimer) könnte man zwar genauer Arbeiten und die Uhr "besser/genauer" darstellen, aber das wär' dann wie mit Kanonen auf Spatzen schießen.

Macci 25. Nov 2008 14:55

Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
 
Zitat:

Zitat von himitsu
Ja und es wird nicht jede Sekunde das Event ausgelöst ... wenn dein Programm z.B. 10 Sekunden lang seine Nachrichten (Messages) nicht bearbeitet, dann sind nicht (wie man vielleicht denken könnte) auch 10 Timer-Nachrichten in der Liste, sondern nur eine.

Japp, genau deswegen darf man das Timersteuerelement nicht mit den entsprechenden Windows API Funktionen verwechseln. :-D Ich habe deswegen auch auf die APIs hingewiesen, weil @DerDan ausdrücklich MESSAGES wollte.

Viele Grüsse,
Macci


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 Uhr.

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