首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭句柄后调用的ReadDirectoryChangesW异步完成例程

关闭句柄后调用的ReadDirectoryChangesW异步完成例程
EN

Stack Overflow用户
提问于 2019-12-07 03:03:50
回答 1查看 254关注 0票数 0

我正在使用ReadDirectoryChangesW监视某个目录中的文件何时发生了更改。我正在使用它的异步版本和一个完成例程函数(根据文档)。

一切正常,直到我希望停止监视文件夹。

为了停止监视,我调用了Close函数。

问题是我仍然收到最后一个通知,但到那时我已经销毁了我的LPOVERLAPPED值。

如何停止ReadDirectoryChangesW并防止调用我的MyCompletionRoutine函数。

代码语言:javascript
复制
// get the handle    
_handle = CreateFileW( ... )

void Read()
{
  ...
  ReadDirectoryChangesW( _handle, ..., &MyCompletionRoutine );
  ...
}

void Close()
{
  ::CancelIo(_handle );           
  ::CloseHandle(_handle );
}

void __stdcall MyCompletionRoutine (
    const unsigned long dwErrorCode,
    const unsigned long dwNumberOfBytesTransfered,
    _OVERLAPPED* lpOverlapped )
{
  // ... do stuff and start a read again
  Read();
}

在上面的代码中,我可能调用了Read,但我想在调用MyCompletionRoutine之前停止。

我不确定这是否有帮助,但我得到的错误消息是317

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 03:51:17

您正在关闭您的HANDLE并过早释放您的OVERLAPPED

CancelIo() (和它的跨线程兄弟CancelIoEx())只是将活动的I/O操作标记为已取消,然后退出,但您仍然需要真正等待这些操作完全完成,然后才能释放它们的OVERLAPPED

如果某个操作在未完成工作前通知取消,将停止工作并上报完成,错误码为ERROR_OPERATION_ABORTED;否则将正常完成工作并上报完成,并返回相应的错误代码。

在调用CancelIo/Ex()之后,您需要继续等待和处理已完成的操作,直到没有更多的操作可等待。

换句话说,MyCompletionRoutine()确实可以在CancelIo()被调用之后调用,并且它需要在再次调用Read()之前检查ERROR_OPERATION_ABORTED。如果在调用CancelIo()时有一个挂起的读取正在进行,则需要等待该读取完成。

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

https://stackoverflow.com/questions/59218907

复制
相关文章

相似问题

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