【问题标题】:Asynchronous ReadDirectoryChangesW()?异步 ReadDirectoryChangesW()?
【发布时间】:2008-12-04 07:13:21
【问题描述】:

我想监视指定目录中的修改,并检索准确的更改信息。所以我决定使用ReadDirectoryChangesW() 函数。但是我想异步使用它,这意味着如果目录没有变化,我不希望我的工作线程被阻塞。

我该怎么做?

【问题讨论】:

    标签: c++ c asynchronous winapi


    【解决方案1】:

    我倾向于将ReadDirectoryChangesW() 与 I/O 完成端口一起使用,这适用于您想要监控多个目录的情况,因为您可以让一个线程为 IOCP 提供服务并处理所有调用的结果ReadDirectoryChangesW()。

    首先通过调用CreateIoCompletionPort() 创建一个IOCP。启动一个调用 GetQueuedCompletionStatus() 并处理异步目录更改的线程。

    现在对于您要监控的每个目录。首先,正常打开您的目录句柄。接下来,通过调用 CreateIoCompletionPort() 并传入 IOCP 句柄将其与您的 IOCP 相关联(有关详细信息,请参阅文档)。最后,调用ReadDirectoryChangesW() 并传递OVERLAPPED,详见文档。调用将返回,如果成功,结果将作为您为服务 IOCP 而创建的线程中的GetQueuedCompletionStatus() 的结果可用。

    【讨论】:

    • 谢谢!我想使用完成例程。你对此有什么想法吗?
    • 另一个问题是,如何从 GetQueuedCompletionStatus() 方法中检索更改信息?是否包含在 OVERLAPPED 结构中?
    • 我没有使用完成例程,因为它们使用起来更复杂,因为您需要确保调用 ReadDirectoryChangesW() 的线程处于警报等待状态...
    • 我所做的是创建一个继承自 OVERLAPPED 并包含数据缓冲区的类。然后,我为每个手表创建其中一个并将其传递给 ReadDirectoryChangesW()。当 GetQueuedCompletionStatus() 返回时,您有一个指向该类的指针,并且可以像进行同步调用一样访问数据。
    【解决方案2】:

    来自MSDN documentation for ReadDirectoryChnagesW()

    对于异步完成,您可以通过以下方式之一接收通知 三种方式:

    • 使用 GetOverlappedResult 函数。接收通知 通过GetOverlappedResult,不要 在 lpCompletionRoutine 参数。确定 设置 hEvent 的成员 OVERLAPPED 结构为唯一 事件。
    • 使用 GetQueuedCompletionStatus 函数。到 通过接收通知 GetQueuedCompletionStatus,不要 在中指定完成例程 lpCompletion 例程。关联 目录句柄 hDirectory 与 通过调用完成端口 CreateIoCompletionPort 函数。
    • 使用完成例程。通过接收通知 完成例程,不关联 带有完成端口的目录。 在中指定完成例程 lpCompletion 例程。这个套路是 每当操作完成时调用 线程完成或取消 处于警报等待状态。这 OVERLAPPED 的 hEvent 成员 系统不使用结构, 所以你可以自己使用它。

    【讨论】:

    • 谢谢!但我对 MSDN 所说的有点困惑。你能再解释一下吗?
    • 我想知道如果我想在一个线程中同时监控多个目录,哪种方法更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多