首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetOverlappedResult返回true,但不返回数据写入

GetOverlappedResult返回true,但不返回数据写入
EN

Stack Overflow用户
提问于 2017-11-03 11:45:59
回答 1查看 432关注 0票数 1

我用下面的代码检查异步写入。

代码语言:javascript
复制
BOOL bOk = ::GetOverlappedResult(hFile, pOverlapped, dwBytesTransferred, TRUE);
if ( FALSE == bOk )
{
     TRACE_ERROR_NO_ASSERT(GetOverlappedResult);
}

bOk为真,但dwBytesTransferred为0,而pOverlapped> is为258(超时)。

我的问题是:我的异步操作超时了吗?还是失败了?我应该打电话给CancelIo取消这样的超时操作吗?

代码语言:javascript
复制
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文档,但没有对此条件进行描述。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-03 12:02:05

您的操作已用STATUS_TIMEOUT完成(失败)--这是最终状态,操作完成。您不需要也不能取消它-它完成了GetOverlappedResult返回TRUE,而不是设置错误代码--这只是这个win32 api的错误(我说是错误)设计。它无条件地返回TRUE,不设置最后一个错误,如果是(0 <= status)。结果是进程STATUS_TIMEOUT错误(我认为您使用了串行(com)端口)。

所以正式的回答:

  1. 你的手术结束了。
  2. 您不应该调用CancelIo

但是,我认为使用GetOverlappedResult进行异步i/o完全没有意义。需要使用apc或iocp完成。

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

https://stackoverflow.com/questions/47095029

复制
相关文章

相似问题

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