异步ReadDirectoryChangesW()?

时间:2008-12-04 07:13:22

标签: c++ winapi

我想监视指定目录中的修改,并检索确切的更改信息。所以我决定使用ReadDirectoryChangesW()函数。但我想异步使用它,这意味着如果目录中没有任何更改,我不希望我的工作线程被阻止。我怎么能这样做?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

来自MSDN documentation for ReadDirectoryChnagesW()

  

对于异步完成,您可以在其中一个中接收通知   三种方式:

     
      
  • 使用GetOverlappedResult函数。接收通知   通过GetOverlappedResult,不要   指定一个完成例程   lpCompletionRoutine参数。确定   设置hEvent成员   OVERLAPPED结构独特   事件
  •   
  • 使用GetQueuedCompletionStatus函数。至   收到通知   GetQueuedCompletionStatus,不要   指定一个完成例程   用lpCompletionRoutine。关联   目录句柄hDirectory用   通过调用完成端口   CreateIoCompletionPort函数。
  •   
  • 使用完成例程。通过收到通知   完成例程,不要关联   具有完成端口的目录。   在中指定完成例程   用lpCompletionRoutine。这个例程是   只要操作已经被调用   线程完成或取消   处于警报等待状态。该   重叠的成员OVERLAPPED   系统不使用结构,   所以你可以自己使用它。
  •