首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从其他线程停止ReadDirectoryChangesW

如何从其他线程停止ReadDirectoryChangesW
EN

Stack Overflow用户
提问于 2012-01-12 02:14:26
回答 4查看 3K关注 0票数 4

我使用下一段代码来了解某个文件夹中的文件何时发生了更改:

代码语言:javascript
复制
HANDLE hDir = ::CreateFile(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL);

FILE_NOTIFY_INFORMATION returnData[1024];
DWORD returnDataSize = 0;                   

while(ReadDirectoryChangesW(hDir, returnData, sizeof(returnData), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE, &returnDataSize, NULL, NULL))
{
    ...
}

ReadDirectoryChangesW会阻止线程,直到文件发生更改。有什么方法可以停止/强制从这个函数返回吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-12 17:38:05

从你的描述来看,听起来CancelIoEx应该能做到这一点。显然,您需要另一个线程来完成此任务,因为您现在正在同步调用它。这会阻塞调用线程,因此您无法从该线程执行任何操作,甚至不能停止。

票数 6
EN

Stack Overflow用户

发布于 2012-01-12 02:34:09

我认为你需要看看这篇博文:http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html

这是一篇很长的文章,但内容非常丰富,它讨论了与这种方法相关的所有问题。

票数 1
EN

Stack Overflow用户

发布于 2012-01-12 03:18:33

您需要在异步操作模式下调用此API函数。与许多其他文件API一样,您可以通过将OVERLAPPED结构传递给API调用来实现这一点。

当您异步操作时,函数将立即返回,当您选择收集结果时,这取决于您。您可以测试函数是否准备好提供结果,可以选择通知API有可用的结果,可以取消挂起的I/O,还可以选择阻塞,直到结果可用。它有非常大的灵活性,在异步模式下使用API自然会更加复杂。

在MSDN上有很多关于重叠I/O的信息。从这里开始:Synchronization and Overlapped Input and Output

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8824473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档