2009-11-26 3 views
0

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

Merci.

+0

Système d'exploitation? Avez-vous l'intention d'utiliser la fonctionnalité Op Sys ou de rouler la vôtre? – Elemental

+0

Le système d'exploitation est Windows. Ils m'ont montré des trucs win32 aussi – NeverAgain

Répondre

2

Il existe deux manières distinctes d'implémenter un temporisateur en utilisant des 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 de traitement d'un message). Par conséquent, SetTimer n'est pas viable si vous n'exécutez pas de pompe de message. Les rappels sont appelés par le système d'exploitation, qui ne connaît pas un pointeur "this" C++ à partir d'un trou dans le sol, donc votre callback doit être soit une fonction globale C-style ou un membre statique.

  2. timeSetEvent fait partie de la famille de temporisateurs "multimédias" et ne nécessite pas de pompe de message. Les observations sur la signature de la fonction de rappel ci-dessus s'appliquent quand même. Le manque d'exigence pour une pompe de message peut être important si vous écrivez une application de console cependant.

  3. Vous pouvez également envisager threading et CreateWaitableTimer, mais je n'utilise pas souvent les minuteurs attentistes donc je ne peux pas les commenter.

Si vous avez besoin de travailler en arrière-plan, l'enfilage 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 êtes en train de filer (ce que vous faites si vous lancez le travail à partir d'une minuterie).Mais bien sûr, votre thread ne peut pas toucher l'interface graphique, donc la vie peut devenir un peu compliqué quand vous commencez à enfiler. Il y a une introduction aux fils de travail sur mon site Web here.

0

Votre question est assez floue, mais il est probable qu'ils vous proposaient de créer un fil de discussion et d'exécuter votre fonction dans ce fil. Ceci 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 invoque une fonction de rappel après un certain temps ... sans une question plus précise, je ne peux pas donner de conseils plus précis.

+0

Est-il possible de le faire sans fil? Les threads sont-ils faciles à créer? Je n'ai pas encore appris le multithread, c'est pourquoi je reste habituellement loin des réponses parlant des discussions. Mais il semble que ce soit le seul moyen pour moi ... – NeverAgain

+0

Chaque fois que vous voulez "exécuter quelque chose en arrière-plan", vous pensez probablement à utiliser un fil ou un processus séparé. –

1

Analogie?

Jetez un oeil ici pour une brève explication des fonctions de rappel:
What is a “callback” in C and how are they implemented?

l'aide d'une minuterie avec un rappel serait dire « fonction d'appel x toutes y secondes » et avec un système qui prend en charge multi-tâches, cette fonction serait appelé toutes les secondes dans un deuxième thread d'exécution, peu importe ce que la fonction d'origine pourrait faire. Edit: Comme cela a été suggéré dans une autre réponse, le système pourrait ne pas créer un deuxième thread pour vous, auquel cas vous devrez créer le thread vous-même et configurer le rappel à partir de ce thread. Editer: Sous Windows, vous pouvez utiliser la fonction SetTimer. Il affichera un message WM_TIMER dans la file d'attente des messages de votre fenêtre, que votre boucle de messages pourrait gérer elle-même ou passer à la procédure de message par défaut pour appeler une fonction de rappel que vous avez spécifiée. Je ne suis pas sûr de ce qui se passe si vous n'avez pas de fenêtre, mais essayez-le.

Questions connexes