2009-04-21 7 views
1

Quelles sont les différentes manières de configurer une minuterie à l'aide de l'API Windows. Quels sont les avantages et les inconvénients de chaque méthode? J'utilise C++ de MS DevStudio.Comment utiliser les minuteries dans Windows

+0

@subbu: Si vous voulez vraiment obtenir de l'aide ici afin que vous voudrez peut-être lire attentivement: http://www.catb.org /~esr/faqs/smart-questions.html. Vos questions sont si vastes qu'il est difficile de comprendre ce que vous essayez de faire. Donc, évidemment, vous aider n'est pas très facile. –

+0

Votre question ressemble plus à une demande "afin de rendre tout exemple de code compatible avec cela". Soyez poli et les 50 000+ personnes ici seront gentils avec vous –

+0

+1 pour des améliorations sur l'édition. –

Répondre

1

Une autre méthode de gestion des temporisateurs consiste à utiliser des objets temporisables. Ceux-ci ne nécessitent aucun traitement de message, n'utilisez pas WM_TIMER ou les rappels. En tant que tels, ils sont un peu plus complexes. Comprendre le système d'événements Windows sera utile.

Il existe trois types d'objets de minuterie: réinitialisation manuelle, synchronisation et périodique; et il y a quatre fonctions pour manipuler les objets de temporisateur: CreateWaitableTimer, SetWaitableTimer, CancelWaitableTimer et CloseHandle (il y a un cinquième, OpenWaitableTimer mais qui est peu susceptible d'être utile à beaucoup de gens). Il existe également un ensemble de fonctions requises pour la notification du moment où un temporisateur expire: WaitForSingleObject, MsgWaitForSingleObject, WaitForMultipleObjects et MsgWaitForMultipleObjects étant les plus utiles.

La méthode habituelle pour l'utilisation de ces compteurs est:

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

Comparez cela à SetTimer - la seule façon de savoir si une minuterie a expiré est à ce sondage, que ce soit dans une boucle ou avec un délai d'attente infinte (c'est à dire suspendre le fil jusqu'à ce que la minuterie se soit écoulée).

Avantages: très flexible, pas besoin d'avoir une file d'attente de messages. Inconvénients: difficile à utiliser

0

Habituellement, regardez l'API que vous allez utiliser, par exemple MFC, Qt ou GTK; ils ont tous des classes de minuterie.

Si vous ne comptez pas utiliser une API graphique, Personnellement, je aime boost :: timer (www.boost.org)

2

Il y a deux fonctions liées à la minuterie sur le système Windows: SetTimer et KillTimer (I savoir, les noms sont étranges - CreateTimer et DestroyTimer seraient plus sensibles, comme dans CreateWindow et DestroyWindow, mais c'est ce qui est disponible).

SetTimer peut fonctionner dans l'un des deux modes suivants: l'événement timer peut déclencher un rappel défini par l'utilisateur ou envoyer un message à une fenêtre. Le format de cette fonction est:

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

Pour utiliser un rappel:

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

Pour obtenir un message WM_TIMER à une fenêtre:

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

Dans les deux cas, les besoins de fil d'appel Pour avoir une file d'attente de messages lorsque les deux variantes émettent un message WM_TIMER, le gestionnaire par défaut appelle la fonction de rappel.

En fonction du système d'exploitation que vous utilisez, la valeur de l'intervalle a des limites supérieure et inférieure. See the API documentation pour plus de détails.

Pour libérer la minuterie une fois que vous avez terminé avec elle procédez comme suit si vous avez fourni une poignée de fenêtre:

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

et si vous avez utilisé un rappel:

KillTimer (NULL, timer_id); 

Une seule fenêtre peut avoir de nombreux temporisateurs associés, utilisez un event_id différent pour chaque temporisateur. Réutiliser un event_id arrête la première instance de la minuterie sans afficher le message WM_TIMER.

Pour: assez facile à utiliser. Inconvénients: latence entre la fin de l'intervalle et le traitement du message WM_TIMER, la résolution est grande, nécessite une boucle de traitement des messages.

+0

En outre, je pense que ces minuteurs une seule fois. – Skizz

0

Pour timers haute résolution, utilisez queryperformancecounter

+0

La fonction QueryPerformanceCounter est utile pour mesurer la durée d'exécution d'une séquence de code. Ce n'est pas utile quand vous voulez une notification quand une période de temps s'écoule, ce qui nécessiterait une boucle d'interrogation: do {sleep un peu} while (l'intervalle n'est pas expiré). – Skizz

Questions connexes