![]() |
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) ; } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 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