Question

Quelqu'un m'a suggéré d'utiliser les fonctions de rappel pour implémenter une minuterie à exécuter en arrière-plan pendant que mon application serveur lit les entrées des clients. J'ai essayé de regarder des explications en ligne, mais j'espérais que quelqu'un pourrait me donner une analogie plus simple.

Merci.

Était-ce utile?

La solution

Il existe deux méthodes distinctes pour implémenter une minuterie à l'aide de rappels dans Windows, SetTimer et timeSetEvent. Les bases sont:

  1. SetTimer utilise des messages, même si vous utilisez un rappel (la fonction de rappel est appelée à la suite du traitement d'un message). Donc, SetTimer n'est pas viable si vous n'exécutez pas de pompe de messages.

  2. Les rappels sont appelés par le système d'exploitation, qui ne connaît pas de code C ++ "this". pointeur depuis un trou dans le sol, votre rappel doit donc être une fonction globale de style C ou un membre statique.

  3. timeSetEvent fait partie de la liste "multimédia". famille de minuterie, et ne nécessite pas de pompe à message. Les observations sur la signature de la fonction de rappel ci-dessus s'appliquent toujours. Le manque d’exigence d’une pompe de messages peut être important si vous écrivez une application pour console.

  4. Vous pouvez également envisager de threader et CreateWaitableTimer, mais je n'utilise pas très souvent des minuteries en attente, je ne peux donc pas les commenter.

Si vous devez travailler en arrière-plan, le threading peut être un moyen beaucoup plus élégant de résoudre le problème. Vous n'avez pas à diviser le travail en morceaux lorsque vous enfilez (ce que vous faites si vous commencez le travail avec une minuterie). Mais bien sûr, votre fil ne peut pas toucher l'interface graphique, alors la vie peut devenir un petit compliqué lorsque vous commencez à enfiler des threads. Un ici contient une introduction aux discussions des travailleurs sur mon site Web.

Autres conseils

Analogie?

Cliquez ici pour une brève explication des fonctions de rappel:
Qu'est-ce qu'un "rappel" en C et comment sont-ils mis en œuvre?

Utiliser une minuterie avec un callback signifierait 'appeler la fonction x toutes les y secondes' et avec un système prenant en charge le multitâche, cette fonction serait appelée toutes les y secondes dans un deuxième thread d'exécution, quelle que soit la fonction d'origine. être en train de faire.

Éditer: comme cela a été suggéré dans une autre réponse, le système pourrait ne pas créer un second thread pour vous. Dans ce cas, vous devrez le créer vous-même et configurer le rappel à partir de ce thread.

Modifier: Sous Windows, vous pouvez utiliser le . SetTimer fonction. Il publiera un message WM_TIMER dans la file d'attente des messages de votre fenêtre, que votre boucle de message pourrait gérer elle-même ou transférer à la procédure de message par défaut pour appeler une fonction de rappel que vous avez spécifiée. Je ne sais pas ce qui se passera si vous n'avez pas de fenêtre, mais essayez-le.

Votre question est assez floue, mais il est probable qu'ils vous ont suggéré de créer un fil et d'exécuter votre fonction dans ce fil.

Cela peut être fait en sous-classant une classe Thread spécifique au système; en construisant la même classe avec une sorte de fonction de rappel en tant qu'argument; en créant une minuterie qui appelle une fonction de rappel après un certain délai ... sans poser de question plus précise, je ne peux pas donner de conseil plus précis.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top