我用下面的代码检查异步写入。
BOOL bOk = ::GetOverlappedResult(hFile, pOverlapped, dwBytesTransferred, TRUE);
if ( FALSE == bOk )
{
TRACE_ERROR_NO_ASSERT(GetOverlappedResult);
}bOk为真,但dwBytesTransferred为0,而pOverlapped> is为258(超时)。
我的问题是:我的异步操作超时了吗?还是失败了?我应该打电话给CancelIo取消这样的超时操作吗?
BOOL bOk = ::GetOverlappedResult(hFile, pOverlapped, dwBytesTransferred, TRUE);
if ( FALSE == bOk )
{
TRACE_ERROR_NO_ASSERT(GetOverlappedResult);
return FALSE;
}
if ( 0 == dwBytesTransferred )
{
CancelIoEx(hFile, pOverlapped); // is this neccessary?
}我引用MSDN文档,但没有对此条件进行描述。
提前谢谢。
发布于 2017-11-03 12:02:05
您的操作已用STATUS_TIMEOUT完成(失败)--这是最终状态,操作完成。您不需要也不能取消它-它完成了。GetOverlappedResult返回TRUE,而不是设置错误代码--这只是这个win32 api的错误(我说是错误)设计。它无条件地返回TRUE,不设置最后一个错误,如果是(0 <= status)。结果是进程STATUS_TIMEOUT错误(我认为您使用了串行(com)端口)。
所以正式的回答:
但是,我认为使用GetOverlappedResult进行异步i/o完全没有意义。需要使用apc或iocp完成。
https://stackoverflow.com/questions/47095029
复制相似问题