ReadDirectoryChangesW проблемы

Я использую ReadDirectoryChangesW для просмотра изменений каталога асинхронно, на основе этого вопроса я реализую функцию, которая наблюдает за данным каталогом, но я все еще получаю сообщение об ошибке GetQueuedCompletionStatus(): Timeout

void Filewatcher::OpenWatchDir(QString PathToOpen)
{

    QString path=QDir::fromNativeSeparators(PathToOpen);

    LPCTSTR  Dirname=(LPCTSTR)path.utf16();//.toStdWString().c_str();

    dirinfo_t* d =(dirinfo_t*) malloc(1*sizeof(dirinfo_t));
    d->CompletionKey = (ULONG_PTR)&somekey;
    dirinfo_init(d);

    /* set up */
    runthread = TRUE;
    d->hDirFH = CreateFile(Dirname,
                    FILE_LIST_DIRECTORY,
                    FILE_SHARE_READ|FILE_SHARE_WRITE,
                    NULL,
                    OPEN_EXISTING,
                    FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
                    NULL);

    d->hDirOPPort = CreateIoCompletionPort(d->hDirFH, NULL,
                          (ULONG_PTR)d->CompletionKey, 1);

    DWORD errorcode = 0;    // an error code
    BOOL bResultQ = FALSE;  // obvios=us
    BOOL bResultR = FALSE;
    DWORD NumBytes = 0;
    FILE_NOTIFY_INFORMATION* pInfo = NULL; // the data incoming is a pointer
                                           // to this struct.
    int i = 0;

    while ( runthread )
        {
            bResultR = ReadDirectoryChangesW(d->hDirFH, (void*)d->buffer,
                                              16777216, TRUE,
                   FILE_NOTIFY_CHANGE_FILE_NAME  | FILE_NOTIFY_CHANGE_CREATION  ,
                                              NULL,
                                              &d->o->overlapped,
                                              NULL );
            bResultQ = GetQueuedCompletionStatus(d->hDirOPPort,
                                                 &NumBytes, &(d->CompletionKey),
                                                 (LPOVERLAPPED*)(d->o), 1000);
            if ( bResultQ && bResultR )
                    {
                wprintf(L"\n");
                pInfo = (FILE_NOTIFY_INFORMATION*) d->buffer;
                wprintf(L"File %s", pInfo->FileName);
                wprintf(L" changes %d\n", pInfo->Action);

                qDebug()<<"file  "<<pInfo->FileName<<" was"<<pInfo->Action;
                memset(d->buffer, 0, 16777216);
            }
            else
                   {
                       errorcode = GetLastError();

                       if ( errorcode == WAIT_TIMEOUT )
                       {
                           qDebug()<<"GetQueuedCompletionStatus(): Timeout\n";
                       }
                       else
                       {
                           qDebug()<<"GetQueuedCompletionStatus(): Failed\n";
                           qDebug()<<"Error Code "<<errorcode;
                       }
                       Sleep(500);
                   }
               }


}

Мне нужно знать, как использовать ReadDirectoryChangesW асинхронно с IoCompletionPort,

Любая помощь, пожалуйста.

2 ответа

Решение

Спасибо вам, ребята, за ваши ответы, после глубокого исследования и повторного тестирования кода я решаю свою проблему, основываясь на этом, я очень ценю вашу помощь.

Нет никакой причины использовать порт завершения здесь, простой перекрывающийся ввод-вывод с событием будет работать невероятно.

Ключ заключается в том, чтобы ждать этой операции (будь то событие или порт завершения) одновременно со всеми другими событиями (возможно, включая сообщения GUI) и проверять состояние только тогда, когда событие становится сигнальным. Для этого используйте (Msg)WaitForMultipleObjects(Ex),

В Qt вы можете добавлять события Win32 (используется OVERLAPPED структура для асинхронного ввода-вывода) с использованием QWinEventNotifier как описано здесь:

Другие вопросы по тегам