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,

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

0

Решение

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

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

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

2

Другие решения

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

0

По вопросам рекламы [email protected]