2008-12-04 7 views
1

Je souhaite surveiller les modifications dans un répertoire spécifié et récupérer les informations de modification exactes. J'ai donc décidé d'utiliser la fonction ReadDirectoryChangesW(). Mais je veux l'utiliser de manière asynchrone, ce qui signifie que je ne veux pas que mon thread de travail soit bloqué s'il n'y a pas de changements dans le répertoire. Comment puis-je faire ceci?ReadDirectoryChangesW asynchrone()?

Merci!

Répondre

1

De l'MSDN documentation for ReadDirectoryChnagesW():

Pour l'achèvement asynchrone, vous pouvez recevoir une notification dans l'une des trois façons :

  • Utilisation de la fonction GetOverlappedResult. Pour recevoir la notification via GetOverlappedResult, ne pas spécifiez une routine d'achèvement dans le paramètre lpCompletionRoutine. Assurez-vous que pour définir le membre hEvent de la structure OVERLAPPED sur un événement unique .
  • Utilisation de la fonction GetQueuedCompletionStatus. Pour recevoir une notification via GetQueuedCompletionStatus, ne pas spécifier une routine d'achèvement dans lpCompletionRoutine. Associez le répertoire gérer hDirectory à un port d'achèvement en appelant la fonction CreateIoCompletionPort .
  • Utilisation d'une routine d'achèvement. Pour recevoir une notification via une routine d'achèvement , n'associez pas au répertoire avec un port d'achèvement. Spécifiez une routine d'achèvement dans lpCompletionRoutine. Cette routine est appelée chaque fois que l'opération a été terminée ou annulée alors que le thread est dans un état d'attente d'alerte. Le membre hEvent de la structure OVERLAPPED n'est pas utilisé par le système, , vous pouvez donc l'utiliser vous-même.
+0

Merci! Mais je suis un peu confus par ce que dit MSDN. Pouvez-vous expliquer un peu plus? – user26404

+0

Je veux savoir quelle méthode est la meilleure si je veux surveiller plus d'un répertoire simultanément dans un seul thread. – user26404

3

J'ai tendance à utiliser ReadDirectoryChangesW() avec un port d'achèvement d'E/S, ce qui est bon pour quand vous voulez surveiller plusieurs répertoires parce que vous pouvez avoir un seul thread service de la IOCP et le traitement des résultats de tous vos appels à ReadDirectoryChangesW().

Créez d'abord un IOCP, une fois, en appelant CreateIoCompletionPort(). Démarrez un thread qui appelle GetQueuedCompletionStatus() et traite les modifications de votre répertoire asynchrone.

Maintenant pour chaque répertoire que vous voulez surveiller. Commencez par ouvrir votre gestionnaire de répertoire normalement. Ensuite, associez-le à votre IOCP en appelant CreateIoCompletionPort() et en passant le handle IOCP (voir docs pour plus de détails). Enfin, appelez ReadDirectoryChangesW() et passez un OVERLAPPED comme détaillé dans les docs. L'appel renverra et, en cas de succès, les résultats deviendront disponibles en tant que résultats de GetQueuedCompletionStatus() dans le thread que vous avez créé pour le service IOCP.

+0

Merci! Je veux utiliser la routine d'achèvement. Avez-vous une idée à ce sujet? – user26404

+0

Une autre question est, comment puis-je récupérer l'information de changement de la méthode GetQueuedCompletionStatus()? Est-ce inclus dans la structure OVERLAPPED? – user26404

+0

Je n'ai pas utilisé les routines d'achèvement car elles sont plus complexes à utiliser car vous devez vous assurer que le thread qui appelle ReadDirectoryChangesW() est dans un état d'attente alerte ... –