Vorheriges Kapitel:Dokument und Ansicht  Nächstes Kapitel: ActiveX       Inhaltsverzeichnis Inhaltsverzeichnis       Die Downloadseite Download       Kontakt Kontakt

 

 

Der Einsatz von Timern

 

Man kann in Windows wie bei anderen modernen Betriebssystemen bei laufender Anwendung, Hintergrundprozesse erledigen oder mehre Programme gleichzeitig laufen lassen. Diese Fähigkeit wird grob gesagt, als Multitasking bezeichnet. Ein weiterer Begriff in diesem Zusammenhang heißt Multithreading. Multithreading ist die Technik, mit der Sie mehre getrennt ablaufende Vorgänge als Teile Ihrer Anwendung realisieren können. Ein Thread ist vergleichbar mit einem Unterprogramm. Eine Anwendung kann mehre Threads erstellen und diese quasi parallel laufen lassen. Es gibt bestimmte Techniken und Routinen, die die Kommunikation der Threads mit der Anwendung und umgekehrt sicherstellen. Die Beherrschung dieser Techniken ist relativ komplex und zeitaufwendig. Man kann jedoch mit dem Einsatz von Timern die Multithreading-Programmierung in vielen Fällen umgehen. Ein Timer ist eine interne Routine, die das Betriebssystem dazu veranlaßt, in bestimmten Zeitintervallen die Windows Nachricht WM_TIMER zu senden. Der Zeitintervall wird durch den time-out-Wert bestimmt. Ein time-out-Wert ist eine Zeitspanne, die von einem Timer in Millisekunden gemessen wird.

Man kann Timer in vielen Bereichen einsetzen. Ein Beispiel wäre zum Beispiel das Einlesen eines Kommunikationspuffers nach allen 200 Millisekunden. Man kann auch Animationen mit Timern steuern. Der Umgang mit Timern ist relativ einfach. Um einen Timer benutzen zu können, müssen Sie ihn zuerst mit Hilfe der CWnd Member-Funktion SetTimer() setzen. Danach müssen Sie mit Hilfe von ClassWizard eine Nachrichten-Funktion für die Nachricht WM_TIMER erzeugen. In dieser Funktion müssen Sie die Anweisung, die in bestimmten Zeitintervallen wiederholt werden sollte, schreiben. Timer sind Globale Resourcen, deren Anzahl beschränkt ist. Daher sollte man sicherstellen, daß der Timer, den man gesetzt hat, auch verfügbar ist. Einen Timer können Sie mit der CWnd Member-Funktion KillTimer() wieder löschen. Es sollte noch erwähnt werden, daß Sie auch mehre Timer setzen können. Das Beispielprogramm zu diesem Thema heißt anim, das eine einfache Animation demonstriert. Es bewegen sich zwei Figuren, ein Kreis und ein Rechteck entlang einer Sinus- und Cosinus-Funktion mit variablen Maßen,wobei interessante Kombinationen entstehen. Erstellen Sie ein neues SDI Projekt namens anim und akzeptieren Sie ab Schritt zwei des AppWizards die Standarteinstellungen. Öffnen Sie bitte die Datei animView und rufen Sie ClassWizard auf. Erzeugen Sie drei Nachrichten-Funktionen für die Nachrichten OnInitialUpdate, WM_TIMER und WM_DESTROY. Deklarieren Sie außerdem eine öffentliche int Variable i in der Headerdatei der Ansicht. Die Variable i wird im Konstruktor der Ansicht auf Null gesetzt. In dieser Anwendung wird der Timer in der Funktion OnInitialUpdate gesetzt. Der Quellcode dazu sieht wie folgt aus:

void CAnimView::OnInitialUpdate() 
{
CView::OnInitialUpdate();
	
	// Ab hier:
MessageBox("Hier beobachten Sie den Einsatz von Timern.");

int Probe=SetTimer(1,300,NULL);
    if(Probe==0)
AfxMessageBox("Kann den Timer nicht installieren !");	

}

Der erste Parameter in der Funktion SetTimer() zeigt den Timer, der zweite Parameter zeigt den Zeitintervall(time-out) in Millisekunden und der dritte Parameter ist NULL. Falls der Rückgabewert der Funktion SetTimer() Null sein sollte, dann ist der Timer nicht verfügbar.

Der Quellcode zum Zeichnen der Figuren befindet sich in der Funktion OnDraw() und bedarf keiner Erläuterung:

void CAnimView::OnDraw(CDC* pDC)
{

CAnimDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

COLORREF farbe=RGB(255,75,120);
CRect rect;
GetClientRect(&rect);
CBrush brush,*oldbrush;
brush.CreateSolidBrush(farbe);
oldbrush=pDC->SelectObject(&brush);
pDC->Ellipse(i*10,sin(i)*30+150,i*11+30,sin(i)*100+150);
pDC->Rectangle(i*10,cos(i)*30+200,i*11+30,cos(i)*120+230);
pDC->SelectObject(oldbrush);

i=i+1;

    if((i*11+50)>rect.right)
          {
	i=0;
          } 
}

Die Anweisung zur Wiederholung des Zeichenvorgangs muß sich in der Nachrichten-Funktion von WM_TIMER befinden. Der Quellcode für die Funktion OnTimer() sieht folgendermaßen aus:

void CAnimView::OnTimer(UINT nIDEvent) 
{
// Ab hier:
Invalidate();
CView::OnTimer(nIDEvent);
}

Die Anweisung Invalidate() wird bei jedem time-out, das 300 Millisekunden beträgt, ausgeführt. In dieser Anwendung wird der Timer in der Nachrichten-Funktion OnDestroy gelöscht, was wie folgt aussieht:

void CAnimView::OnDestroy() 
{
CView::OnDestroy();

// Ab hier:
KillTimer(1);
}

Der Parameter der CWnd Member-Funktion KillTimer() zeigt den Timer, den Sie vorher in SetTimer() gesetzt hatten.

 

 

 

      Vorheriges Kapitel:Dokument und Ansicht  Nächstes Kapitel: ActiveX       Inhaltsverzeichnis Inhaltsverzeichnis       Die Downloadseite Download       Kontakt Kontakt