【发布时间】:2012-10-15 14:21:30
【问题描述】:
我正在使用ReadDirectoryChangesW 异步监视目录更改,基于此question 我实现了一个监视给定目录的函数,但我仍然收到错误消息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 异步使用。
请帮忙。
【问题讨论】:
-
也许在你超时的那一秒内目录没有改变?
-
我将其更改为 10000 毫秒我现在可以看到我的事件,但我现在的问题是我无法再处理我的应用程序(调用不在单独的线程中),我想这就是异步处理
ReadDirectoryChangesW的重点。如何将我的应用程序线程与监视目录线程分开? -
oumaya:关键是您可以使用
(Msg)WaitForMultipleObjects(Ex)同时等待完成端口和其他对象,甚至是GUI消息。因此,您可以在等待完成端口的同时做其他有用的工作。 -
嗯,在 Qt 中,您别无选择,只能在单独的线程中运行它。通常,您会将等待集成到您的消息泵中,但不幸的是,Qt 中没有提供此功能。
-
@avakar:所以 Qt 没有等同于
XtAddAppInput的功能,无法将新的句柄/文件描述符放入等待循环?当它不支持 Win32 和 Unix 工具包几十年来的基本操作时,它是如何获得追随者的?
标签: c++ c winapi asynchronous readdirectorychangesw