Timer
-
Hi!
Ich möchte ein Programm mit timern schreiben. Der Timer soll jede Sekunde auslösen und eine Funktion (immer wieder die selbe) aufrufen. Wenn zum Zeitpunkt des neuen Auslösensdie alte Funktion noch läuft soll sie nicht erneut aufgerufen werden, sondern eine zweite Funktion.
Mein Problem fängt leider schon ganz am Anfang an: Ich möchte mit SetTimer den Timer starten, Mein Compiler (VC++) meckert aber direkt:
SetTimer(1,3,NULL);
Fehlermeldung: error C2660: 'SetTimer' : Funktion akzeptiert keine 3 ParameterProblem danach: Wie reagiert man/das programm, wenn der Timer "auslöst", also zu Ende ist?
Vielen Dank an alle, die mir helfen!
Eure Laura
-
Erstens: ANSI-C++ kennt keine Timer.
Zweitens: Für die globale SetTimer()-Funktion fehlt als erster Parameter noch das Handle deines Hauptfensters, die gleichnamige Methode ist nur im Inneren von CWnd-Objekten (oder -Kindern) verfügbar.
Drittens: Die Nachrichtenbehandlung (und damit auch der nächste Timer-Aufruf) kann erst weitergehen, wenn die Timer-Funktion fertig ist. Das bedeutet, wenn du die Funktion direkt in der OnTimer()-Auswertung aufrufst und sie länger als dein Intervall läuft, fällt der nächste Zyklus unter den Tisch. Die Lösung dazu nennt sich Threads - die laufen parallel zum Hauptprogramm und die kannst du auch (per WaitForSingleObject()) überprüfen, ob sie noch laufen:
void OnTimer(UINT id) { if(m_hTimerThread==NULL || WaitForSingleObject(m_hTimerThread,0)!=WAIT_TIMEOUT) //noch nie gestartet oder letzter Aufruf ordnungsgemäß beendet m_hTimerThread = AfxBeginThread(Funktion1,NULL); else Funktion2(); }
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.