Comment utiliser SetTimer API
J'ai essayé d'utiliser SetTimer
API pour appeler une fonction toutes les X minutes. Donc, j'ai écrit ce code de test
void f()
{
printf("Hello");
}
int main()
{
SetTimer(NULL, 0, 1000*60,(TIMERPROC) &f);
}
J'aurais Bonjour écrite à chaque minute, mais il ne fonctionne pas.
- votre fonction f() doit être une timerproc
- Votre programme est interrompant immédiatement après l'appel de SetTimer() alors bien sûr, rien ne se passe. Le rappel ne sera possible que lorsque la pompe une boucle de message, GetMessage + DispatchMesage. Vous aurez besoin de penser à ce genre de programme que vous allez écrire.
Vous devez vous connecter pour publier un commentaire.
Il ya quelques problèmes avec votre programme:
main()
donc il y a peu de temps lorsque le minuteur peut se produire.Win32 compteurs doivent le message de la pompe (voir ci-dessous) à travailler, car ils sont mis en œuvre par
WM_TIMER
message, même quand ils ne sont pas associés à une fenêtre, et si vous fournissent la fonction de rappel.La fonction de rappel a une mauvaise prototype. Voir http://msdn.microsoft.com/en-us/library/windows/desktop/ms644907%28v=vs.85%29.aspx
(Remarque: cet exemple de programme ne se termine jamais, au lieu de cela, véritable programme devrait avoir de la logique supplémentaire pour le faire en envoyant
WM_QUIT
).<code>
et<pre>
les balises par quatre tirets (plus le retrait de la liste). Voir aussi ici pour la modification de l'aide. J'ai aussi ajouté un devis à partir de MSDN en indiquant votre point n ° 2.KillTimer
à son maître. Ou utiliser un timer avec un drapeau variable et unif
dans le timer proc.J'ai trouvé la meilleure mise en œuvre comme suit:
Puis, dans le cadre de la boucle principale:
window
paramètre est facultatif, si vous fournir un rappel. Et lorsque vous le faites, leWM_TIMER
message n'est plus affiché à la fenêtre de votre. La procédure de fenêtre est vide de sens dans ce scénario. Si vous utilisez une minuterie de rappel, l'ID de minuterie n'est plus associé à une fenêtre, et doit être unique au monde dans votre application. Une application qui utilise la 3e partie du code ne peut pas utiliser codé en dur, les valeurs d'ID sans risquer une collision. À l'aide de l'adresse d'un objet avec la durée de vie appropriée est la technique classique, afin d'assurer l'unicité.WM_TIMER
message et en ayant le système d'invoquer une fonction de rappel. L'OP est de demander à propos de ce dernier, bien que votre réponse explique comment utiliser l'ancien. Les deux voies ont des différences significatives: la Manipulation de la minuterie (gestion des messages dans la fenêtre de procédure vs offrant un rappel) et la portée de l'ID de l'unicité (fenêtre vs demande). Bien que cette réponse ne parvient pas à expliquer, comment utiliser les minuteries avec un rappel, il tombe à court de leur expliquer, pourquoi l'OP code ne fonctionne pas. Cette réponse n'est pas utile.