2009-04-21 20 views
1

Wie kann ein Timer mithilfe der Windows-API eingerichtet werden? Was sind die Vor- und Nachteile der einzelnen Methoden?Verwenden von Timern unter Windows

Ich benutze MS DevStudio C++.

+0

@subbu: Wenn Sie wirklich hier helfen wollen auszukommen SO sollten Sie diese sorgfältig lesen: http://www.catb.org /~esr/faqs/smart-questions.html. Ihre Fragen sind so breit, dass es schwer zu verstehen ist, was Sie zu tun versuchen. Es ist also nicht einfach, dir zu helfen. –

+0

Ihre Frage klingt mehr wie eine Nachfrage "also machen Sie einen beliebigen Beispielcode damit kompatibel". Sei höflich und die 50.000+ Leute hier werden dir nett sein –

+0

+1 für Verbesserungen am Edit. –

Antwort

1

Eine weitere Methode zur Behandlung von Timern ist die Verwendung von Waitable-Timer-Objekten. Diese erfordern keine Nachrichtenverarbeitung, verwenden Sie WM_TIMER oder Rückrufe nicht. Als solche sind sie ein bisschen komplexer. Das Windows-Ereignissystem zu verstehen, wird hilfreich sein.

Es gibt drei Arten von Timer-Objekten: manuelle Rückstellung, Synchronisierung und periodische; und es gibt vier Funktionen für die Behandlung der Timer-Objekte: CreateWaitableTimer, SetWaitableTimer, CancelWaitableTimer und CloseHandle (es gibt eine fünfte, OpenWaitableTimer, aber das ist unwahrscheinlich für viele Menschen nützlich). Es gibt auch eine Reihe von Funktionen, die für die Benachrichtigung darüber benötigt werden, wann ein Timer abläuft: WaitForSingleObject, MsgWaitForSingleObject, WaitForMultipleObjects und MsgWaitForMultipleObjects sind am nützlichsten.

Die übliche Methode, um diese Zeiten für die Verwendung ist:

CreateWaitableTimer (...) 
SetWaitableTimer (...) 
WaitForSingleObject (...) 
CloseHandle (...) 

diese vergleichen zu SetTimer - der einzige Weg, zu wissen, ob ein Timer abgelaufen ist, ist es abzufragen, entweder in einer Schleife oder mit einem infinte Timeout (dh den Thread anhalten, bis der Timer abgelaufen ist).

Pros: sehr flexibel, keine Notwendigkeit, eine Nachrichtenwarteschlange zu haben. Nachteile: schwer

0

Normalerweise sehen Sie sich die API an, die Sie verwenden werden, zum Beispiel MFC, Qt oder GTK; Sie alle haben Timer-Klassen.

Wenn Sie nicht eine GUI-API zu verwenden, gehen, ich persönlich wie boost :: Timer (www.boost.org)

2

Es gibt zwei Timer bezogene Funktionen auf dem Windows-System: SetTimer und Killtimer (I weiß, die Namen sind seltsam - CreateTimer und DestroyTimer wären sinnvoller, wie in CreateWindow und DestroyWindow, aber das ist was verfügbar ist).

SetTimer kann in einem von zwei Modi funktionieren: Das Timer-Ereignis kann einen benutzerdefinierten Rückruf auslösen oder eine Nachricht an ein Fenster senden. Das Format dieser Funktion ist:

timer_id = SetTimer (window, event_id, interval, callback); 

einen Rückruf zu benutzen:

timer_id = SetTimer (NULL, NULL, interval_in_milliseconds, callback); 

Um eine WM_TIMER Nachricht an ein Fenster:

timer_id = SetTimer (window, event_id, interval_in_milliseconds, NULL); 

In beiden Fällen sind die aufrufende Thread Bedürfnisse Um eine Nachrichtenwarteschlange zu erhalten, da beide Varianten eine WM_TIMER-Nachricht ausgeben, ruft der Standardhandler die Rückruffunktion auf.

Abhängig von dem Betriebssystem, das Sie verwenden, hat der Wert von interval obere und untere Grenzen. See the API documentation für weitere Details.

den Timer frei, nachdem Sie damit machen folgendes fertig sind, wenn Sie einen Fenstergriff versehen:

KillTimer (window, event_id); // event_id is important! 

und wenn Sie einen Rückruf verwendet:

KillTimer (NULL, timer_id); 

kann ein einzelnes Fenster Da viele Timer damit verbunden sind, verwenden Sie für jeden Timer eine andere event_id. Die Wiederverwendung einer event_id stoppt die erste Instanz des Timers, ohne die WM_TIMER-Nachricht zu senden.

Pros: ziemlich einfach zu bedienen. Nachteile: Latenz zwischen Intervallende und Verarbeitung von WM_TIMER Nachricht, Auflösung ist groß, erfordert eine Nachrichtenverarbeitungsschleife.

+0

Auch ich denke diese Timer ein One-Shot nur. – Skizz

0

Für hochauflösende Timer zu verwenden, verwenden queryperformancecounter

+0

Die QueryPerformanceCounter-Funktion ist nützlich, um zu messen, wie lange eine Code-Sequenz zur Ausführung benötigt. Es ist nicht sinnvoll, wenn Sie eine Benachrichtigung erhalten möchten, wenn eine Zeitspanne verstrichen ist, die eine Abrufschleife erfordern würde: do {schlaf ein Bit} während (Intervall nicht abgelaufen). – Skizz

Verwandte Themen