Как остановить ReadDirectoryChangesW из другого потока - PullRequest
4 голосов
/ 11 января 2012

Я использую следующий код, чтобы узнать, когда файлы изменяются в определенной папке:

HANDLE hDir = ::CreateFile(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL);

FILE_NOTIFY_INFORMATION returnData[1024];
DWORD returnDataSize = 0;                   

while(ReadDirectoryChangesW(hDir, returnData, sizeof(returnData), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE, &returnDataSize, NULL, NULL))
{
    ...
}

ReadDirectoryChangesW блокирует поток, пока не произойдет изменение файла. Есть ли способ остановить / принудительно вернуться из этой функции?

Ответы [ 5 ]

6 голосов
/ 12 января 2012

Из вашего описания это звучит так: CancelIoEx должно сработать.Очевидно, вам нужен другой поток для этого, так как теперь вы вызываете его синхронно.Это блокирует вызывающий поток, поэтому вы ничего не можете сделать из этого потока, даже не остановиться.

1 голос
/ 11 января 2012

Вам необходимо вызвать эту функцию API в ее асинхронном режиме работы.Вы достигаете этого, как и во многих других файловых API, передавая структуру OVERLAPPED в вызов API.

Когда вы работаете асинхронно, функция немедленно возвращается, и вам решать, когдавы решили собрать результаты.Вы можете проверить, готова ли функция к выдаче результатов, можете ли вы получать уведомления о том, что API имеет результаты, вы можете отменить ожидающий ввод-вывод и можете заблокировать, пока результаты не станут доступны.Гибкость очень велика, и, естественно, API более сложен для использования в асинхронном режиме.

На MSDN имеется много информации о перекрывающихся операциях ввода-вывода.Начните здесь: Синхронизация и перекрывающиеся входы и выходы .

1 голос
/ 11 января 2012

Я думаю, вам нужно взглянуть на это сообщение в блоге: http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html

Это длинное сообщение, но оно очень информативное и рассказывает обо всех проблемах, связанных с этим методом.

0 голосов
/ 12 января 2012

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

0 голосов
/ 11 января 2012

Вы можете увидеть, как я остановил это в JNotify windows реализация . смотрите ~ Win32FSHook ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...