Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1327010
  • 博文数量: 436
  • 博客积分: 7854
  • 博客等级: 少将
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-18 16:30
文章分类

全部博文(436)

文章存档

2013年(2)

2012年(56)

2011年(70)

2010年(308)

分类:

2010-04-23 15:35:26

进程之间的通信可以通过发送消息,共享内存和设置全局Event等方式进行,这儿介绍一下通过设置多个Event来进行通信,以满足通信中不同信息的传递。(非常抱歉采用Event来叙述,因为网站的某个信息拦截系统对中文的Event进行了拦截,无法上传。)在下面的例子中,是A进程等待B进程运行结果。

A进程:

cpp代码
  1. ////////////////////////////////////  
  2. //定义  
  3. HANDLE m_hEvent[3];  
  4.    
  5. ////////////////////////////////////  
  6. //建立事件,比如为:失败,成功,其他三种情况  
  7. m_hEvent[0] = CreateEvent(NULL, TRUE, FALSE, "syn_event_failed");  
  8. m_hEvent[1] = CreateEvent(NULL, TRUE, FALSE, "syn_event_success");  
  9. m_hEvent[2] = CreateEvent(NULL, TRUE, FALSE, "syn_event_others");  
  10. ResetEvent(m_hEvent[0]);  
  11. ResetEvent(m_hEvent[1]);  
  12. ResetEvent(m_hEvent[2]);  
  13.    
  14. ////////////////////////////////////  
  15. //启动进程B  
  16. char path[255];  
  17. strcpy(path,"c:abc.exe");  
  18. ShellE xecute(NULL, NULL, path, NULL, NULL, SW_SHOWNORMAL);  
  19.    
  20. ////////////////////////////////////  
  21. //等待事件  
  22.  short returnFlag = 10;  
  23.  DWORD Event = 0;  
  24.  DWORD count = 0;  
  25.  while (1)  
  26.  {  
  27.   count++;  
  28.   // 参数设置为不阻塞线程,每次执行该函数,约间隔50ms  
  29.   Event = WaitForMultipleObjects(3, m_hEvent, FALSE, 50);  
  30.     
  31.   switch (Event)  
  32.   {//WAIT_OBJECT_0 WAIT_ABANDONED_0  
  33.   case 0:   
  34.    {//失败  
  35.     returnFlag = 0;  
  36.    }  
  37.    break;   
  38.   case 1:    
  39.    {//成功   
  40.     returnFlag = 1;  
  41.    }  
  42.    break;  
  43.   case 2:  
  44.    {//其他  
  45.     returnFlag = 2;  
  46.    }  
  47.    break;  
  48.    
  49.   }  
  50.   if (returnFlag != 10)  
  51.   {  
  52.    CloseHandle(m_hEvent[0]);  
  53.    CloseHandle(m_hEvent[1]);  
  54.    CloseHandle(m_hEvent[2]);  
  55.    //返回  
  56.    return returnFlag;  
  57.   }  
  58.   if (count >= 1000)  
  59.   {//考虑到万一没有被打开handle,则超时退出  
  60.   //此处要考虑进程B完成任务的最长时间  
  61.    return 0;  
  62.   }  
  63.  }  

 B进程:

cpp代码
  1. ////////////////////////////////  
  2. // 定义  
  3. HANDLE m_hEvent;  
  4.    
  5. //////////////////////////////////  
  6. // 执行程序  
  7. short ret = Func1();  
  8. //////////////////////////////////////////////////////////////////////////  
  9. // 返回结果  
  10.  m_hEvent = NULL;  
  11.  switch(ret)  
  12.  {//打开事件为可以修改方式  
  13.  case 0:  
  14.    m_hEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, "syn_event_failed");  
  15.   break;  
  16.  case 1:  
  17.    m_hEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, "syn_event_success");  
  18.   break;  
  19.  case 2:  
  20.    m_hEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, "syn_event_others");  
  21.   break;  
  22.  }  
  23.    
  24.    
  25.  if(m_hEvent != NULL)  
  26.  {  
  27.  //设置事件  
  28.   SetEvent(m_hEvent);  
  29.   Sleep(100);  
  30.  }   
  31.    
  32.  //返回  
  33.  return;  
  34.    
  35. //////////////////////////////////////////////  

采用事件方式进行进程之间的通信,比较简单,但是通信的信息量比较小。如果需要大的数据通信或者同步,可以采用共享内存的方式。我会另写文字叙述。

阅读(7395) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~