2010-07-13 4 views
5

J'ai besoin d'ajouter la prise en charge des minuteurs dans une application basée sur les ports d'achèvement d'E/S (IOCP). Je voudrais éviter l'utilisation d'un thread spécifique pour gérer les timers. Sous Linux, vous pouvez créer un temporisateur qui délivre des notifications d'expiration via un descripteur de fichier (voir timerfd.h man), donc c'est génial de l'utiliser par exemple avec epoll si votre application est basée sur epoll.Minuteur prenant en charge les E/S superposées (pour IOCP)?

Sous Windows, vous pouvez utiliser "minuteries waitable" avec un appel de procédure asynchrone (ACP) (voir http://msdn.microsoft.com/en-us/library/ms686898(v=VS.85).aspx)

Si vous êtes intéressé, kqueue (BSD, Mac OS) prend en charge les minuteries par défaut (voir EVFILT_TIMER) . Avec les ports d'achèvement d'E/S, nous devons utiliser des objets prenant en charge les E/S superposées. Alors, y a-t-il une telle minuterie pour IOCP?

Meilleures salutations,

Cédrics

Répondre

5

Pour autant que je sais qu'il n'y a pas de minuteries qui génèrent une fin IOCP quand ils arrivent à expiration.

Vous pouvez essayer la file d'attente de minuterie Windows; CreateTimerQueueTimer. J'ai fini d'écrire ma propre file d'attente qui utilise un thread supplémentaire pour exécuter les timers, donc ce n'est probablement pas bon pour vous: Voir here pour une série d'articles où j'implémente la file d'attente avec TDD et les tests unitaires complets. Je suis en train d'implémenter un TimerWheel de plus haute performance avec la même interface, mais encore une fois cela utilisera un thread externe pour gérer les minuteurs.

0

Vous pouvez utiliser des temporisateurs attendus et mettre en file d'attente un paquet personnalisé vers le port d'achèvement en utilisant "PostQueuedCompletionStatus". Mais rappelez-vous que s'il y a plusieurs threads de travail, seul un thread sera notifié.

Questions connexes