我用以下代码检查异步写入。
BOOL bOk = ::GetOverlappedResult(hFile, pOverlapped, dwBytesTransferred, TRUE);
if ( FALSE == bOk )
{
TRACE_ERROR_NO_ASSERT(GetOverlappedResult);
}
bOk为TRUE,但dwBytesTransferred为0,pOverlapped-> Internal为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文档,但没有描述这种情况。
提前感谢。
答案 0 :(得分:1)
您的操作已完成(失败)STATUS_TIMEOUT
- 这是最终状态并且操作已完成。你不需要也不能取消它 - 完成。 GetOverlappedResult
返回TRUE并且没有设置错误代码 - 这只是这个win32 api的设计(我说是错误)。它无条件地返回TRUE
并且如果(0 <= status)
则不设置上一个错误。结果是错误的进程STATUS_TIMEOUT
(我认为您使用了串行(com)端口)。
如此正式的答案:
但是我认为使用GetOverlappedResult
对于异步i / o完全没有意义。需要使用apc或iocp完成。