Je souhaite utiliser un pool de threads pour initier/annuler des opérations de lecture superposées - en utilisant ReadFile()
et CancelIo()
respectivement - et gérer les événements de port d'achèvement lorsque les opérations de lecture sont terminées.E/S avec chevauchement: comment réveiller un thread sur un événement de port d'achèvement ou un événement normal?
- Tout thread peut lancer une opération de lecture
- Tout thread peut gérer un événement complet-lecture
- Seul le thread qui a initié une lecture peut l'annuler (ce qui est une limitation
CancelIo()
)
Je ne suis pas sûr comment implémenter ceci. On appelle normalement GetQueuedCompletionStatus()
pour attendre les événements de port d'achèvement et WaitForSingleObject()
pour attendre les événements normaux, mais il n'est pas clair comment mélanger les deux. Si PostQueuedCompletionStatus()
me permettrait de spécifier un fil spécifique pour se réveiller, je serais défini. Des idées?
MISE À JOUR: La solution doit être exécutée sur Windows XP. Malheureusement, cela exclut l'utilisation CancelIoEx()
ou GetQueuedCompletionStatusEx()
.
Malheureusement, GetQueuedCompletionStatusEx() et CancelIoEx() nécessitent Windows Vista. Je vais mettre à jour la question pour noter que je suis à la recherche de solutions qui sont rétrocompatibles avec Windows XP. – Gili
Oups, oublié que GQCSEx était également> = Vista ... mise à jour. – Richard
Comment notifiez-vous le pool de threads "initier et annuler" qu'il doit appeler ReadFile()? Si j'utilise WaitOnMultipleObjects() où un seul événement indique un ReadFile en attente(), ne suis-je pas en train de vérifier toutes les lectures dans un seul thread? – Gili