原帖及讨论:http://bbs.bccn.net/thread-235625-1-1.html 自动事件 和 手工事件 的类型均为 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                   
     
  说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。 
 |