![]() |
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 |
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.
|
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Dann wären die Hardwareanforderungen von Windows noch höher
|
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 |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Wenn es um eine genaue Taktung geht GetTickCount()
|
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
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 |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
ist GetTickCount() eine Message? mfg DerDan |
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).
|
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
mfg DerDan |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Hallo DerDan,
für Zeitmessungen benutze ich
Delphi-Quellcode:
Sind wesentlich genauer als GetTickCount.
QueryPerformanceFrequency(T11);
QueryPerformanceCounter(T12); Vielleicht solltest Du mal unter Multimedia-Timer suchen und evt. direkt die API-Programmieren. Bis bald Chemiker |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Da es ihm nur um Sekunden geht, sollte es aber reichen
|
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? |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
Sollten die Ungenauigkeiten zu groß werden, kann man immernoch QP-Counter verwenden und/oder timebased movement. |
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. |
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 |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
Zitat:
Zitat:
|
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. |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Hallo,
schau mal ![]() |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
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. |
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. |
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. |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
|
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 |
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:
|
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Hallo,
Zitat:
Ein paar Konstanten für definierte Zeiträume
Delphi-Quellcode:
Eine Funktion zum Berechnen der Zeitdifferenz bis zum nächsten Timerereignis.
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 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:
Uhrzeit lesen und Millisekunden bis zur nächsten vollen Sekunde berechnen, kann doch garnicht so schwer sein?
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;
Delphi-Quellcode:
Timer.Enabled := False;
// Schiebe Zeiger eine Position weiter: Timer.Interval := CalcTimerInterval(iOneSecond); Timer.Enabled := True; |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
|
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Im sleep?
Sherlock |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
Und wieso? Hast du schon mal gelesen, was
Delphi-Quellcode:
macht?
sleep
mfg DerDan |
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 |
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) ; } |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
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 ;) |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
Viele Gruesse, Macci |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
Vielen Dank |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
nochmal kurz zu
Zitat:
Code:
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.
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; 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) |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Also ich wäre ja bei folgender Überlegung stutzig geworden:
Zitat:
|
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
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 ( ![]() ![]() |
Re: gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)
Zitat:
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