windows message mówiący o zmianie zegara systemowego

0

Witam serdecznie forumowiczów,
potrzebuję pomocy w namierzeniu komunikatu mówiącego o zmianie zegara systemowego (dokładnie przejście daty) i nie chodzi mi tu konkretnie o zmianę czasu przez użytkownika bo taki komunikat znam WM_TIMECHANGE, tylko o naturalnie idący do przodu zegar (interwał dowolny). Rozwiązania na TTimer i odpytywaniem o datę mnie nie interesują.
Pozdrawiam.

0

nie ma czegoś takiego.
A tak swoją drogą to jak to sobie wyobrażasz? Co ile wg Ciebie miałby taki komunikat przychodzić? Co sekundę, milisekundę, godzinę??

0

No wyobrazić sobie mogę to w sposób że system wysyła komunikat z najmniejszym interwałem jaki posiada w

type TSystemTime = record
 Year: Word;	
  Month: Word;	
  Day: Word;	
  Hour: Word;	
  Minute: Word;	
  Second: Word;	
  MilliSecond: Word; 	
end;

Pomińmy tu kwestię optymalizacji kolejki komunikatów ;)
Nie zmienia to faktu że Twoja odpowiedź mnie satysfakcjonuje, co potwierdziło moje przypuszczenia o braku takiego komunikatu.
Pozwolę sobie w takim razie zadać pytanie czy lepiej w tej sytuacji wykorzystać wątek czy SetTimer i komunikat WM_TIMER w którym bym sprawdzał datę?

0

Pozwolę sobie w takim razie zadać pytanie czy lepiej w tej sytuacji wykorzystać wątek czy SetTimer i komunikat WM_TIMER w którym bym sprawdzał datę?
Jeśli Twoja procedura nie robi nic co mogłoby doprowadzić do zablokowania dostępu do formy to użyj timera. Wątków się używa tylko gdy jest to potrzebne (bo potem trzeba robić TRTLCriticalSection i inne takie bzdety).

0

co ile chcesz to sprawdzać?
No i to co napisał Opi

1

Nie ma takiego komunikatu, bo byłby niepotrzebnym przymulaniem systemu: wysyłać co chwilę do każdego okna komunikat, którego te okna w większości nie potrzebują.

Obecnie w normalnej sytuacji, kiedy „nic się nie dzieje”, okna nie dostają nic. Dzięki temu nieaktywne procesy mogą nie być w ogóle wykonywane przez dłuższy czas, i wylecieć do swapa w tym czasie.

Do tego doszłoby pytanie: jak często? Jeden program potrzebuje raz na sekundę, a drugi 10 razy na sekundę. To co piszesz „z najmniejszym interwałem” byłoby zabójcze dla wydajności, i trzymało użycie procka blisko 100% przez cały czas.

Pozwolę sobie w takim razie zadać pytanie czy lepiej w tej sytuacji wykorzystać wątek czy SetTimer i komunikat WM_TIMER w którym bym sprawdzał datę?
Z jaką precyzją potrzebujesz tej zmiany daty? Zauważ, że trafia się ona raz na 24 godziny, czyli raz na 86400 sekund, czyli raz na 86400000 milisekund...
Do tego dokładnie wiadomo, kiedy będzie. Możesz raz sprawdzić godzinę, obliczyć że północ będzie za np. 45454 sekund i tak ustawić timera. Kiedy nastąpi, przestaw timera na równe 24 godziny. Maksymalny interwał windowsowego timera to około 24 dób, 20 godzin 31 minut i 23 sekundy.
Jeżeli obsuwa rzędu sekundy to dla ciebie za dużo, możesz ustawić timera na 2350 i przejść tymczasowo na timera o rozdzielczości np. 0,1 s.
Większa precyzja jest prawdopodobnie niepotrzebna, a jeżeli jest to jest to i tak nieodpowiednie narzędzie.

0

Sprawa bynajmniej z pozoru prosta, datę potrzebuje do nazwy pliku jaką generuje mi HotLog, problem może pojawić się na przełomie doby, logowanie jest z dokładnością do milisekund (nie jest to ciągłe logowanie tylko w momencie wystąpienia określonych zdarzeń), więc może się tak zdarzyć że zapisy z nowej doby będą jeszcze w pliku oznaczonym datą wcześniejszą jeśli nie odświeżę odpowiednio szybko parametru nazwy generowanego pliku.

0

Jest takie coś jak mmtimer, ma największą możliwą dokładność, tylko należy pamiętać że callback odpala się z innego wątku.
Możesz również zrobić to na własnym wątku, który trzeba odpalić z priorytetem timecritical.
Na każdym kroku wyliczasz ile zostało czasu do momentu kiedy trzeba coś odpalić po czym dajesz sleep() np na (pozostało_czasu*9/10+minimalny_krok_czasowy).
Z tym że nadal będziesz odpalać coś z innego wątku niż główny wątek programu.

0
satq napisał(a)

Sprawa bynajmniej z pozoru prosta, datę potrzebuje do nazwy pliku jaką generuje mi HotLog, problem może pojawić się na przełomie doby, logowanie jest z dokładnością do milisekund (nie jest to ciągłe logowanie tylko w momencie wystąpienia określonych zdarzeń), więc może się tak zdarzyć że zapisy z nowej doby będą jeszcze w pliku oznaczonym datą wcześniejszą jeśli nie odświeżę odpowiednio szybko parametru nazwy generowanego pliku.

znaczy, że nazwy pliku nie generujesz (sprawdzasz czy jest poprawna) w momencie dodawania wpisu tylko sprawdzając na bieżąco datę i jeśli jest zmiana daty to zmieniasz nazwę pliku????

0

Algorytm jaki mam obecnie wygląda tak: przy starcie aplikacji pobieram datę systemową na jej podstawie generuję nazwę pliku np. dla dnia dzisiejszego 20110613 i podaję tą zmienną jako parametr do HotLog-a .hlWriter.hlFileDef.fileName teraz muszę zabudować mechanizm podmiany tego parametru w momencie przejścia doby. Oczywiście Timer będzie najprostszym rozwiązaniem ale czy optymalnym do takiego rozwiązania ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1