OVERLAPPED.hEvent是否需要CreateEvent()?

callmefriend 2013-11-20 09:42:34
最近在使用IOCP做串口通信,参考到MSDN(
引用
http://msdn.microsoft.com/en-us/library/ff802693.aspx]http://msdn.microsoft.com/en-us/library/ff802693.aspx
)以下代码,居然在使用重叠结构时新建了一个事件:
DWORD dwRead;
BOOL fWaitingOnRead = FALSE;
OVERLAPPED osReader = {0};

// Create the overlapped event. Must be closed before exiting
// to avoid a handle leak.
osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (osReader.hEvent == NULL)
// Error creating overlapped event; abort.


但是,我以前异步使用串口时,从未给OVERLAPPED.hEvent新建一个事件,但是仍然可以正常使用的。

请问,这个OVERLAPPED的hEvent成员是否必须要手动初始化?
...全文
455 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ColdMooon 2013-12-06
  • 打赏
  • 举报
回复
文件对象本身也能当一个event用. 如果不创建event,等待此OVERLAPPED的函数就会等待文件对象. 一个线程这么做没问题,但多个线程这么做就分不清了. 个人经验,写串口可不用event,读串口最好用上.否则会出现很多0长度的假消息.
u012879806 2013-12-05
  • 打赏
  • 举报
回复
引用 10 楼 callmefriend 的回复:
谢谢各位的关注。 但是依然不明白#8的回复: “使用的理由: 是否完成通知。” 这个能否再解释?
是否需要 “通知”
callmefriend 2013-12-04
  • 打赏
  • 举报
回复
谢谢各位的关注。 但是依然不明白#8的回复: “使用的理由: 是否完成通知。” 这个能否再解释?
wwwhhb4002 2013-11-30
  • 打赏
  • 举报
回复
好问题,正好我也不懂
bsnry 2013-11-28
  • 打赏
  • 举报
回复
引用 6 楼 callmefriend 的回复:
[quote=引用 5 楼 vocanicy 的回复:] [quote=引用 2 楼 u012879806 的回复:] [quote=引用 1 楼 vocanicy 的回复:] MSDN原话:The calling process must set this member either to zero or a valid event handle before it calls any overlapped functions. 调用线程必须设置hEvent为NULL或者一个合法的Event句柄 如果你需要通过hEvent来判断IO是否完成,就可以创建这个对象 一般用于多个IO操作并发情况下,通过WaitForMultipleObjects可以等待多个IO操作
在重叠io中也未必要创建吧 iocp中倒是可以不创建。 比如重叠io中使用完全例程 [/quote] 看清楚没? 我说的就是未必要创建Event啊,你需要就创建,不需要就赋NULL [/quote] “如果你需要通过hEvent来判断IO是否完成,就可以创建这个对象” 请问这句话怎么理解? 不管是异步IO还是IOCP等,都是非阻塞,应该是都使用了hEvent吧?[/quote] 重叠io可以使用 event,也可以不使用。 大多重叠io都使用。 对于iocp 可以使用,也可以不使用。 并没有规定,必须使用, 使用的理由: 是否完成通知。 一家之言。
callmefriend 2013-11-26
  • 打赏
  • 举报
回复
引用 5 楼 vocanicy 的回复:
[quote=引用 2 楼 u012879806 的回复:] [quote=引用 1 楼 vocanicy 的回复:] MSDN原话:The calling process must set this member either to zero or a valid event handle before it calls any overlapped functions. 调用线程必须设置hEvent为NULL或者一个合法的Event句柄 如果你需要通过hEvent来判断IO是否完成,就可以创建这个对象 一般用于多个IO操作并发情况下,通过WaitForMultipleObjects可以等待多个IO操作
在重叠io中也未必要创建吧 iocp中倒是可以不创建。 比如重叠io中使用完全例程 [/quote] 看清楚没? 我说的就是未必要创建Event啊,你需要就创建,不需要就赋NULL [/quote] “如果你需要通过hEvent来判断IO是否完成,就可以创建这个对象” 请问这句话怎么理解? 不管是异步IO还是IOCP等,都是非阻塞,应该是都使用了hEvent吧?
vocanicy 2013-11-23
  • 打赏
  • 举报
回复
引用 2 楼 u012879806 的回复:
[quote=引用 1 楼 vocanicy 的回复:] MSDN原话:The calling process must set this member either to zero or a valid event handle before it calls any overlapped functions. 调用线程必须设置hEvent为NULL或者一个合法的Event句柄 如果你需要通过hEvent来判断IO是否完成,就可以创建这个对象 一般用于多个IO操作并发情况下,通过WaitForMultipleObjects可以等待多个IO操作
在重叠io中也未必要创建吧 iocp中倒是可以不创建。 比如重叠io中使用完全例程 [/quote] 看清楚没? 我说的就是未必要创建Event啊,你需要就创建,不需要就赋NULL
bsnry 2013-11-21
  • 打赏
  • 举报
回复
引用 3 楼 yaozhiyong110 的回复:
看你需不需要完成通知 不需要就不创建 需要就创建呗 完成了会setevent...
这个创建 是需要需要 手工reset 恢复的, overlapped完成后,确实自动wsasetevenet了。 如果是createevent 创建的,则是自动帮你 setevent了
yaozhiyong110 2013-11-21
  • 打赏
  • 举报
回复
看你需不需要完成通知 不需要就不创建 需要就创建呗 完成了会setevent...
u012879806 2013-11-20
  • 打赏
  • 举报
回复
引用 1 楼 vocanicy 的回复:
MSDN原话:The calling process must set this member either to zero or a valid event handle before it calls any overlapped functions. 调用线程必须设置hEvent为NULL或者一个合法的Event句柄 如果你需要通过hEvent来判断IO是否完成,就可以创建这个对象 一般用于多个IO操作并发情况下,通过WaitForMultipleObjects可以等待多个IO操作
不对吧 在重叠io中也未必要创建吧 iocp中倒是可以不创建。 比如重叠io中使用完全例程
vocanicy 2013-11-20
  • 打赏
  • 举报
回复
MSDN原话:The calling process must set this member either to zero or a valid event handle before it calls any overlapped functions. 调用线程必须设置hEvent为NULL或者一个合法的Event句柄 如果你需要通过hEvent来判断IO是否完成,就可以创建这个对象 一般用于多个IO操作并发情况下,通过WaitForMultipleObjects可以等待多个IO操作

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧