我正在使用ReadDirectoryChangesW监视某个目录中的文件何时发生了更改。我正在使用它的异步版本和一个完成例程函数(根据文档)。
一切正常,直到我希望停止监视文件夹。
为了停止监视,我调用了Close函数。
问题是我仍然收到最后一个通知,但到那时我已经销毁了我的LPOVERLAPPED值。
如何停止ReadDirectoryChangesW并防止调用我的MyCompletionRoutine函数。
// 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
发布于 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()时有一个挂起的读取正在进行,则需要等待该读取完成。
https://stackoverflow.com/questions/59218907
复制相似问题