2009-07-14 4 views
4

Я прочитал документацию для ReadDirectoryChangesW(), а также просмотрел CDirectoryChangeWatcher project, но не сказал , почему можно было бы назвать это асинхронно. Я понимаю, что поток current не будет блокировать, но, по крайней мере, для кода CDirectoryChangeWatcher, который использует порт завершения, когда он вызывает GetQueuedCompletionStatus(), , что нитей блокирует в любом случае (если изменений нет).Зачем использовать ReadDirectoryChangesW асинхронно?

Так что, если я вызываю ReadDirectoryChangesW() синхронно в отдельном потоке, в первую очередь, что мне все равно, если он блокируется, почему я когда-либо хотел бы позвонить ReadDirectoryChangesW() асинхронно?

ответ

5

Когда вы называете это асинхронно, у вас больше контроля над , который нить ждет. Он также позволяет вам иметь один поток, ожидающий нескольких вещей, таких как изменение каталога, событие и сообщение. Наконец, даже если вы делаете ожидание в том же потоке, который сначала настраивает часы, он дает вам контроль над тем, как долго вы готовы ждать. GetQueuedCompletionStatus имеет параметр таймаута, который ReadDirectoryChangesW не предлагает сам по себе.

1

Вы бы назвали ReadDirectoryChangesW таким образом, чтобы он возвращал свои результаты асинхронно, если вам когда-либо понадобилось, чтобы вызывающий поток не блокировался. Тавтология, но правда.

Кандидаты на такие потоки: поток пользовательского интерфейса & любой поток, который несет полную ответственность за обслуживание нескольких ресурсов (сокеты, любые IPC, независимые файлы и т. Д.).

Не знакомы с проектом, я думаю, CDirectoryChangeWatcher не волнует, если его рабочий поток блокируется. Как правило, это характер рабочих потоков.

+0

Значит, вы говорите, что нет веской причины? Опять же, как я сказал первоначально, если бы я заботился, если текущий поток блокирует, я бы создал отдельный поток, который мне не волнует, если он блокирует. –

+0

Создание потока не всегда (хороший) вариант, и API собирается попробовать и обслуживать как можно больше пользователей, таким образом, асинхронный вариант. –

0

Я попытался использовать ReadDirectoryChanges в рабочем потоке синхронно и угадать, что он заблокировал, чтобы поток не выходил сам по себе при выходе из программы. Итак, если вы не хотите использовать такие злые вещи, как TerminateThread, вы должны использовать асинхронные вызовы.

+0

Если нить не остановилась, вы на самом деле не сказали ОС о том, что ваш процесс завершен. 'ExitProcess' завершает все потоки. –

+1

Из MSDN: «Как Процессы Отменено: Процесс выполняется до тех пор один из следующих событий не происходит: - Любой поток процесса вызывает функцию ExitProcess ... Не завершить процесс, если его нитками. находятся в известных состояниях. Если поток ожидает объект ядра, он не будет прерван до завершения ожидания. Это может привести к зависанию приложения ». –

Смежные вопросы