ReadDirectoryChangesW асинхронно не срабатывает
От: InfoPilot  
Дата: 23.10.14 00:12
Оценка:
вызываю так
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 асинхронно не срабатывает
От: InfoPilot  
Дата: 23.10.14 00:17
Оценка:
синхронно работает.
Re: ReadDirectoryChangesW асинхронно не срабатывает
От: InfoPilot  
Дата: 23.10.14 07:29
Оценка:
ни у кого нет никаких предположений?
Re: ReadDirectoryChangesW асинхронно не срабатывает
От: Сергей Мухин Россия  
Дата: 23.10.14 07:41
Оценка:
Здравствуйте, InfoPilot, Вы писали:


IP>но при изменении в директории не срабатывает?

IP>вчем может быть причина?

что такое _CompletionRoutine?
---
С уважением,
Сергей Мухин
Re[2]: ReadDirectoryChangesW асинхронно не срабатывает
От: InfoPilot  
Дата: 23.10.14 07:49
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, InfoPilot, Вы писали:



IP>>но при изменении в директории не срабатывает?

IP>>вчем может быть причина?

СМ>что такое _CompletionRoutine?


функция которая вызыватся при изменениях в директории.

Хотя с ним и без него ничего не происходит, в асинхронном режиме функция нереагирует на изменения в каталоге
Re: ReadDirectoryChangesW асинхронно не срабатывает
От: visual_wind  
Дата: 23.10.14 08:02
Оценка:
Здравствуйте, 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 асинхронно не срабатывает
От: InfoPilot  
Дата: 23.10.14 10:18
Оценка:
странная штука в 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.
в борьбе со здравым смыслом победа будет за нами!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.