Windows und die Zeit

Drucke diesen Post This page as PDF Posted by Hobby Programmierer | Posted in Artikel, WinAPI, Windows | Posted on 12-09-2008

Tags: , , , , , , ,

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

0

Einleitung

In diesem Tutorial wird erklärt, wie man mittels zweier Funktionen
Datum und Uhrzeit abfragen kann.
Wie man eine Windowsanwendung dazu bringt, nach einer bestimmten Zeit
eine Nachricht an das eigene Fenster zu senden.

Welche Vorkenntnisse werden benötigt?

Es werden Grundkenntnisse in C++ benötigt.
Man sollte auch in der Lage sein, ein Fenster samt Nachrichtenschleife auf den Bildschirm zu bringen.
Und man sollte natürlich mit einem C++ Compiler umgehen können.

Datum und Uhrzeit abfragen:

Es gibt 2 Windowsfunktionen, mit denen man Datum und Uhrzeit abfragen kann:
GetLocalTime und GetSystemTime.
Beide Funktionen erwarten als Parameter die Adresse einer Variablen des Typs SYSTEMTIME.
(bei SYSTEMTIME handelt es sich um eine Struktur, näheres dazu siehe MSDN)

Variable deklarieren:

Code: C++ | Plain Text
  1. SYSTEMTIME st;

Funktionsaufruf :

Code: C++ | Plain Text
  1. GetSystemTime(&st); // Adresse von st übergeben

Die Funktion füllt die Struktur dann aus, und wir müssen sie
nur noch auswerten.
Nun gibt es ja zwei Funktionen. Da fragt man sich vielleicht, welche die Bessere ist.
Nun, ich bevorzuge GetLocalTime, weil sie beispielsweise die Uhrzeit automatisch in
Sommerzeit (sofern länderspezifisch unterstützt) umrechnet.
Außerdem berücksichtigt die Funktion auch die Zeitzonen, und gibt wie
der Name schon sagt die Zeit für den Ort (local) zurück, an dem sich der Rechner befindet.
GetSystemTime liefert nur die Uhrzeit im ortsunabhängigen Format zurück.

Der Timer

In Windows gibt es eine Funktion, mit der man eine
Windowsanwendung dazu bringen kann, nach einer bestimmten
Zeit eine Nachricht an das eigene Fenster zu senden, wodurch signalisiert wird, dass ein bestimmter Interval vergangen ist. Zum Beispiel 10 Sekunden.

Man nennt so eine Funktion einen Timer. Man kann
beliebig viele dieser Timer erstellen, welche dann nach einer bestimmten
Zeit eine Nachricht senden. Nun wissen wir was man damit machen kann. Aber
immer noch nicht, wozu er nützlich ist. Beispielsweise kann man mit einer Timernachricht
in bestimmten und regelmäßigen Zeitabständen Aktionen durchführen, z.B. die Zwischenablage
leeren. Aber wie erzeugt man nun so einen Timer? Und wie heißt die Nachricht,
welche man empfängt? Nun, das alles ist nicht so schwer.
Die Nachricht heißt

Code: C++ | Plain Text
  1. WM_TIMER

und einen neuen Timer erzeugt man mit der Funktion

Code: C++ | Plain Text
  1. SetTimer();

Aber es gibt nun 3 verschiedene Arten, wie man einen Timer
mit dieser Funktion erzeugen kann. Sie unterscheiden sich beim Erzeugen nur durch verschiedene Parameter,
welche der Funktion SetTimer übergeben werden. Die Funktion erwartet als ersten
Parameter das Handle des Fensters zu dem der Timer gehören soll. was auch
notwendig ist, da der Timer ja wissen muss an, welches Fenster er eine Nachricht
senden soll. Als zweiten Parameter erwartet sie eine ID des Timers, damit man ihn auch später von mehreren
unterscheiden kann. Will man dem Programm die Wahl lassen welche ID es
benutzt, gibt man einfach 0 an und die Funktion liefert eine ID zurück. Wenn
man dem Programm selbst die Wahl der ID überlässt, benutzt man Methode 2 zum
Erzeugen eines Timers. Als dritten Parameter erwartet sie als einen DWORD-Wert die Millisekunden, nach welchen sie eine Nachricht senden soll. Auch dieses ist bei allen drei Methoden gleich.
Als vierten Parameter erwartet sie den Namen eine Rückruffunktion, welche zum
Bearbeiten der Nachricht des Timers herangezogen wird. Wenn man möchte, dass
die Nachricht des Timers von der gewöhnlichen Nachrichtenverarbeitung des
Fensters in der auch andere Nachrichten wie z.B. WM_CREATE oder WM_PAINT ausgewertet wird, gibt man hier einfach hier NULL an. Wenn man dieses nicht tut, verwendet
man die dritte und letzte Methode zum Erzeugen eines Timers.

Nun zur Besprechung der Rückruffunktion für Methode Nr. 3
zum Erzeugen eines Timers:

Die Rückruffunktion muss wie alle anderen Rückruffunktionen
auch vom Typ CALLBACK sein. Der Name ist frei wählbar, die Parameter aber
nicht! Als Parameter muss man der Funktion
folgende Variablen, die dann von dem Timer intern ausgefüllt werden, übergeben.
Als erstes erwartet sie das Handle des Fensters zu dem der Timer gehört. Dann
eine Variable vom Typ UINT, in der die Art der Nachricht festgehalten wird. Diese
wird jedoch nur WM_TIMER sein. Als dritten Parameter erwartet sie wieder eine
Variable vom Typ UINT, welche die ID des
Timers beinhaltet, damit man ihn auch von mehren Timern unterscheiden kann,
wenn man die Funktion für mehrere Timer benutzt. Als vierten und letzten
Parameter erwartet sie einen DWORD-Wert, welche dann die Zeit, die seit
dem Start von Windows vergangen ist, beinhaltet. Wir werden diesen Wert aber ignorieren.
Übrigens lässt sich dieser Wert auch mit der Funktion GetTickCount
herausfinden.

Man kann in der Rückruffunktion, in der die Timernachricht ausgewertet wird, alles machen.
Zum Beispiel Variablen definieren oder Funktionen aufrufen. Nun wissen wir schon genug, um
uns ein Programm mit einem Timer zu schreiben.

Ich habe auch wieder ein Programm geschrieben, welches den Umgang
mit einem Timer zeigt, und alle 10 Sekunden eine Messagebox ausgibt. Das Archiv,
in der die cpp Datei liegt heißt “Timer1″

Und ich habe noch ein Codebeispiel, welches den Umgang mit
einem Timer zeigt, welche die Nachricht durch eine eigene Rückruffunktion
verarbeitet, geschrieben. Allerdings verwende ich nur diese Methode, wenn das
Auswerten der WM_TIMER Nachricht sehr komplex ausfällt, dass dient dann zur
bessern Übersicht. Das Archiv, in dem sich die cpp Datei befindet heißt “Timer2″.

Schluss

So, das war es auch schon.
Ich hoffe, ich konnte den Inhalt gut vermitteln.

Write a comment