ReadDirectoryChangesW асинхронно не срабатывает
вызываю так
DWORD dwBytesRead = 0;
DWORD dwWaitState = 0;
DWORD status = ERROR_SUCCESS;
DWORD cbNotifyBuffer;
// PFILE_NOTIFY_INFORMATION pNotifyInformation;
// wchar_t filename[MAX_PATH + 1];
OVERLAPPED overlapped;
HANDLE hFile = INVALID_HANDLE_VALUE;
PFILE_NOTIFY_INFORMATION pNotifyBuffer = NULL;
sp->addText(_T("\n" ));
sp->addText(_T("я запустился!-" ));
sp->addText(sp->dirs[i]);
ZeroMemory(&overlapped, sizeof (overlapped));
cbNotifyBuffer = 4096;
pNotifyBuffer = (PFILE_NOTIFY_INFORMATION) new BYTE[cbNotifyBuffer];
if (!pNotifyBuffer)
{
status = ERROR_NOT_ENOUGH_MEMORY;
}
if (status == ERROR_SUCCESS) {
hFile = CreateFileW(sp->dirs[i], FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_DIRECTORY | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
status = GetLastError();
}
}
if (status == ERROR_SUCCESS) {
overlapped.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
HANDLE hEventsToWait[2] = {sp->ev, overlapped.hEvent };
BOOL cik=TRUE;
while (cik) {
ReadDirectoryChangesW(hFile, pNotifyBuffer, cbNotifyBuffer, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE,
NULL, &overlapped, _CompletionRoutine);
dwWaitState = WaitForMultipleObjects(2, hEventsToWait, FALSE, INFINITE);
но при изменении в директории не срабатывает?
вчем может быть причина?
Re: ReadDirectoryChangesW асинхронно не срабатывает
синхронно работает.
Re: ReadDirectoryChangesW асинхронно не срабатывает
ни у кого нет никаких предположений?
Re: ReadDirectoryChangesW асинхронно не срабатывает
Здравствуйте, InfoPilot, Вы писали:
IP>но при изменении в директории не срабатывает?
IP>вчем может быть причина?
что такое _CompletionRoutine?
---
С уважением,
Сергей Мухин
Re[2]: ReadDirectoryChangesW асинхронно не срабатывает
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, InfoPilot, Вы писали:
IP>>но при изменении в директории не срабатывает?
IP>>вчем может быть причина?
СМ>что такое _CompletionRoutine?
функция которая вызыватся при изменениях в директории.
Хотя с ним и без него ничего не происходит, в асинхронном режиме функция нереагирует на изменения в каталоге
Re: ReadDirectoryChangesW асинхронно не срабатывает
Здравствуйте, InfoPilot, Вы писали:
IP>вызываю так
IP>...
IP> OVERLAPPED overlapped;
...
IP> pNotifyBuffer = (PFILE_NOTIFY_INFORMATION) new BYTE [cbNotifyBuffer];
...
IP> ReadDirectoryChangesW(hFile, pNotifyBuffer, cbNotifyBuffer, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME |
IP> FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
IP> FILE_NOTIFY_CHANGE_LAST_WRITE,
IP> NULL, &overlapped, _CompletionRoutine );
...
IP>
IP>но при изменении в директории не срабатывает?
IP>вчем может быть причина?
MSDN говорит, что буффер должен быть выровнен по границе двойного слова, хотя в каментах пишут, что можно и по границе одинарного слова. У вас же он выровнен, судя по всему, по границе байта.
Про _CompletionRoutine вас уже спросили — непонятно, что это такое, тем более, что если вы ее используете, то необходимо грамотно выделять память под структуру OVERLAPPED. У вас это, как я понимаю, делается на стеке, а надо — в куче.
Примеры можете посмотреть
здесь и
здесь .
Re: ReadDirectoryChangesW асинхронно не срабатывает
странная штука в Qt+MinGW собрал, а сборка в Visual Studio не работает???
Re: ReadDirectoryChangesW асинхронно не срабатывает
От:
ononim
Дата: 23.10.14 20:57
Оценка:
IP>IP> ReadDirectoryChangesW(hFile, pNotifyBuffer, cbNotifyBuffer, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME |
IP> FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE |
IP> FILE_NOTIFY_CHANGE_LAST_WRITE,
IP> NULL, &overlapped, _CompletionRoutine);
IP> dwWaitState = WaitForMultipleObjects(2, hEventsToWait, FALSE, INFINITE);
IP>
IP>но при изменении в директории не срабатывает?
IP>вчем может быть причина?
раз у вас _CompletionRoutineто — то и WaitForMultipleObjects должен быть alertable, и с учетом всех ньюансов alertable ожидания
а если приведете полноценный код, который можно вкопипастить в студию и скомпилять ничего не добавляя/удаляя — может еще какие проблемы найду.. или скажу что у "меня все работает"
Как много веселых ребят, и все делают велосипед...
Re: ReadDirectoryChangesW асинхронно не срабатывает
От:
Garrett
Дата: 12.12.14 15:35
Оценка:
Здравствуйте, InfoPilot, Вы писали:
Странный набор флагов в CreateFile. Попробуйте такой вызов:
CreateFile(strDirPath, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED , NULL);
и убрать _CompletionRoutine.
в борьбе со здравым смыслом победа будет за нами!
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить