AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi gibt es eine Message bei Uhrzeit Änderung (jede Sekunde)?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von DerDan · begonnen am 20. Nov 2008 · letzter Beitrag vom 25. Nov 2008
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#21

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

  Alt 21. Nov 2008, 10:24
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#22

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

  Alt 21. Nov 2008, 10:36
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#23

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

  Alt 21. Nov 2008, 11:25
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
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#24

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

  Alt 21. Nov 2008, 11:33
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
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#25

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

  Alt 21. Nov 2008, 11:46
Hallo,
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;
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#26

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

  Alt 21. Nov 2008, 11:58
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
Wo wird Performance gekillt?
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#27

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

  Alt 21. Nov 2008, 12:06
Im sleep?

Sherlock
Oliver
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#28

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

  Alt 21. Nov 2008, 12:09
Zitat von Sherlock:
Im sleep?

Sherlock

Und wieso?

Hast du schon mal gelesen, was sleep macht?


mfg DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#29

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

  Alt 21. Nov 2008, 13:11


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
Oliver
  Mit Zitat antworten Zitat
Macci

Registriert seit: 31. Mai 2007
129 Beiträge
 
#30

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

  Alt 22. Nov 2008, 02:42
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) ;
}
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 23:11 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