| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2767 人关注过本帖, 1 人收藏
标题:谈 自动事件 和 手工事件 的区别
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏(1)
 问题点数:0 回复次数:2 
谈 自动事件 和 手工事件 的区别
自动事件 和 手工事件 的类型均为 CEvent 类,只是第二个参数上有区别:
自动事件:CEvent eventObj;  等效于 eventObj(FALSE,FALSE)
手工事件对象定义方法 CEvent eventObj(FALSE,TRUE);
注:CEvent 其实由四个参数的,可参考msdn
以下通过一个具体示例,说明自动事件 和 手工事件的区别:
// 在视图区添加以下代码:
UINT MessageThread1(LPVOID pParam)
{
    char *pMessage="Thread1 is start";
    CWnd *pMainWnd=AfxGetMainWnd();
    ::MessageBox(pMainWnd->m_hWnd,pMessage,"Thread Message",MB_OK); // 显示信息框
    eventObj.Lock();             // 使线程1一处于等待状态
    pMessage="Thread1 is unblocked";
    ::MessageBox(pMainWnd->m_hWnd,pMessage,"Thread1 Message",MB_OK); // 显示线程1解锁后信息框
    eventObj.Lock();             // 使线程1一处于等待状态
    pMessage="Thread1 is unblocked again";
    ::MessageBox(pMainWnd->m_hWnd,pMessage,"Thread1 Message",MB_OK); // 显示线程1解锁后信息框
    return 0;
}

UINT MessageThread2(LPVOID pParam)
{
    char *pMessage="Thread2 is start";
    CWnd *pMainWnd=AfxGetMainWnd();
    ::MessageBox(pMainWnd->m_hWnd,pMessage,"Thread Message",MB_OK); // 显示信息框
    eventObj.Lock();             // 使线程2一处于等待状态
    pMessage="Thread2 is unblocked";
    ::MessageBox(pMainWnd->m_hWnd,pMessage,"Thread2 Message",MB_OK); // 显示线程2解锁后信息框
    eventObj.Lock();             // 使线程2一处于等待状态
    pMessage="Thread2 is unblocked again";
    ::MessageBox(pMainWnd->m_hWnd,pMessage,"Thread2 Message",MB_OK); // 显示线程2解锁后信息框
    return 0;
}

UINT MessageThread3(LPVOID)
{
    eventObj.SetEvent(); // 把对象事件置为发信状态
    return 0;
}
void CMFCexp12_3View::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    AfxBeginThread(MessageThread1,"Thread is started"); // 启动线程1
    AfxBeginThread(MessageThread2,"Thread is started"); // 启动线程2

    CView::OnLButtonDown(nFlags, point);
}
然后您就能看到程序在定义乘 eventObj(FALSE,FALSE) 和 CEvent eventObj(FALSE,TRUE)时的明显区别:
选择自动事件:每次只能唤醒一个事件
              具体表现:按下四次右键,依次显示 Thread1 is unblocked、Thread2 is unblocked、
         Thread1 is unblocked again和Thread2 is unblocked again
选择手工事件:则eventObj.SetEvent()能唤醒所有被挂起的线程,使恢复运行
         并且一旦使用eventObj.SetEvent()设置成“发信状态”后就一直处于有效状态,除非使用成员对象
         PulseEvent或ResetEvent把它重新设置为“未发现状态”,因此手动对象用来恢复多个等待状态的线程
         具体表现:按下右键后,不但显示了 Thread1 is unblocked和Thread2 is unblocked ,
         而且显示 Thread1 is unblocked again和Thread2 is unblocked again
附完整代码(附件)

MFCexp12_3.rar (31.2 KB)
搜索更多相关主题的帖子: 自动事件 区别 手工事件 CEvent 
2008-09-28 10:25
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
收藏
得分:0 
以前只知道这个 HANDLE h=CreateEvent(....)
现在多知道了一个CEvent类

-︻┻┳═一 ☆ 悲伤的代价就是让自己明白什么是最重要的和应该珍惜的
2008-09-28 21:50
快速回复:谈 自动事件 和 手工事件 的区别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036664 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved