2009-07-14 10 views
4

J'ai lu la documentation pour ReadDirectoryChangesW() et également vu le CDirectoryChangeWatcher project, mais aucun ne dit pourquoi on voudrait l'appeler de manière asynchrone. Je comprends que le thread actuel ne bloquera pas, mais, au moins pour le code CDirectoryChangeWatcher qui utilise un port d'achèvement, lorsqu'il appelle GetQueuedCompletionStatus(), bloque les threads de toute façon (s'il n'y a pas de modifications). En premier lieu, si j'appelle de façon synchrone ReadDirectoryChangesW() dans un thread séparé que je ne m'inquiète pas s'il bloque, pourquoi voudrais-je jamais appeler ReadDirectoryChangesW() de manière asynchrone?Pourquoi utiliser ReadDirectoryChangesW de manière asynchrone?

Répondre

5

Lorsque vous l'appelez de manière asynchrone, vous avez plus de contrôle sur thread fait l'attente. Il vous permet également d'avoir un seul thread d'attente pour plusieurs choses, comme un changement de répertoire, un événement et un message. Enfin, même si vous faites l'attente dans le même fil que la montre en premier lieu, cela vous donne le contrôle sur combien de temps vous êtes prêt à attendre. GetQueuedCompletionStatus possède un paramètre de délai d'attente que ReadDirectoryChangesW n'offre pas par lui-même.

1

Vous appelez ReadDirectoryChangesW de telle sorte qu'il renvoie ses résultats de manière asynchrone si vous avez besoin que le thread appelant ne bloque pas. Une tautologie, mais la vérité.

Candidats pour ces discussions: le fil d'interface utilisateur & tout thread qui est seul responsable de l'entretien d'un certain nombre de ressources (Sockets, tout type d'IPC, fichiers indépendants, etc.).

N'étant pas familier avec le projet, je suppose que le CDirectoryChangeWatcher ne se soucie pas si son thread de travail bloque. Généralement, c'est la nature des threads de travail.

+0

Alors vous dites qu'il n'y a pas de bonne raison? Encore une fois, comme je l'ai dit à l'origine, si je me souciais si le fil courant bloque, je créerais un fil séparé que je m'en fous s'il bloque. –

+0

La création d'un thread n'est pas toujours une option (bonne), et une API va essayer de desservir autant d'utilisateurs que possible, donc l'option asynchrone. –

0

J'ai essayé d'utiliser ReadDirectoryChanges dans un thread de travail de manière synchrone, et devinez quoi, il a bloqué afin que le thread ne puisse pas sortir de lui-même à la sortie du programme. Donc, si vous ne voulez pas utiliser des choses malveillantes comme TerminateThread, vous devez utiliser des appels asynchrones.

+0

Si le thread ne s'est pas arrêté, vous n'avez pas vraiment dit au système d'exploitation que votre processus était terminé. 'ExitProcess' termine tous les threads. –

+1

De MSDN: « Comment les processus sont terminés: Un processus exécute jusqu'à ce que l'un des événements suivants: - Tout thread du processus appelle la fonction ExitProcess ... Ne pas mettre fin à un processus à moins que ses fils. Si un thread attend un objet noyau, il ne sera pas terminé tant que l'attente ne sera pas terminée, ce qui peut entraîner le blocage de l'application. –

Questions connexes