【发布时间】:2008-12-04 07:13:21
【问题描述】:
我想监视指定目录中的修改,并检索准确的更改信息。所以我决定使用ReadDirectoryChangesW() 函数。但是我想异步使用它,这意味着如果目录没有变化,我不希望我的工作线程被阻塞。
我该怎么做?
【问题讨论】:
标签: c++ c asynchronous winapi
我想监视指定目录中的修改,并检索准确的更改信息。所以我决定使用ReadDirectoryChangesW() 函数。但是我想异步使用它,这意味着如果目录没有变化,我不希望我的工作线程被阻塞。
我该怎么做?
【问题讨论】:
标签: c++ c asynchronous winapi
我倾向于将ReadDirectoryChangesW() 与 I/O 完成端口一起使用,这适用于您想要监控多个目录的情况,因为您可以让一个线程为 IOCP 提供服务并处理所有调用的结果ReadDirectoryChangesW()。
首先通过调用CreateIoCompletionPort() 创建一个IOCP。启动一个调用 GetQueuedCompletionStatus() 并处理异步目录更改的线程。
现在对于您要监控的每个目录。首先,正常打开您的目录句柄。接下来,通过调用 CreateIoCompletionPort() 并传入 IOCP 句柄将其与您的 IOCP 相关联(有关详细信息,请参阅文档)。最后,调用ReadDirectoryChangesW() 并传递OVERLAPPED,详见文档。调用将返回,如果成功,结果将作为您为服务 IOCP 而创建的线程中的GetQueuedCompletionStatus() 的结果可用。
【讨论】:
来自MSDN documentation for ReadDirectoryChnagesW():
对于异步完成,您可以通过以下方式之一接收通知 三种方式:
- 使用 GetOverlappedResult 函数。接收通知 通过GetOverlappedResult,不要 在 lpCompletionRoutine 参数。确定 设置 hEvent 的成员 OVERLAPPED 结构为唯一 事件。
- 使用 GetQueuedCompletionStatus 函数。到 通过接收通知 GetQueuedCompletionStatus,不要 在中指定完成例程 lpCompletion 例程。关联 目录句柄 hDirectory 与 通过调用完成端口 CreateIoCompletionPort 函数。
- 使用完成例程。通过接收通知 完成例程,不关联 带有完成端口的目录。 在中指定完成例程 lpCompletion 例程。这个套路是 每当操作完成时调用 线程完成或取消 处于警报等待状态。这 OVERLAPPED 的 hEvent 成员 系统不使用结构, 所以你可以自己使用它。
【讨论】: