注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

对Windows下事件处理的注意点  

2015-08-06 15:13:32|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Windows下事件处理的注意点

 

这几天一直在处理多线程的问题,公司很多的写了C++号称七八年的都弄不清楚到底事件Event在线程中使用的机制。举一个简单例子,手动和自动的情况下有什么不同?如果在事件触发后,没有线程等待,又会怎么样?

同事就遇到这样一个问题,其在关闭程序时放出一个事件,另外一个程序等待这个事件来处理自己,结果有时候儿有人关闭了等待事件的程序。那么程序再启动时就会把逻辑弄乱。这其实就涉及到了事件在操作系统内核中如何处理的问题。

hEvent = CreateEvent(NULL, TRUE/*FALSE*/, FALSE, NULL);//初始化无状态且手动配置,False是自动设置

创建两个线程:

    hThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc1, NULL, 0,NULL);   

     

    hThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc2, NULL, 0,NULL);

然后在界面弄两个按钮:

一个用来专门设置事件,一个用来启动上面的线程。

一开始设置事件N次(自动复位,第二个参数FALSE情况下)。再启动线程,发现只有一个线程启动,也就是说,操作系统对同一个事件,不重复计数,只保存置位状态。启动后随机启动(其实是按入队顺序,不过入队顺序是随机的,但是在JAVA的信号量里有一个TRUE设置,可以强制按线程来使用)。

然后再启动线程,其后再设置事件,效果一样。

如果改成上面的设置,即手动复位,那么两个线程都会自动执行。网上的资料说可以在一个线程是设置ResetEvent(hEvent),则会有一个线程执行,另外一个不执行,这个只是一个大概率事件,其实在有线程切换的情况下,还是会两个都执行的。

这也可以用做C++NOTICEALL这个动作。

  评论这张
 
阅读(262)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017