windows下线程间的通信方式

Posted Curo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows下线程间的通信方式相关的知识,希望对你有一定的参考价值。

1.事件:

(在信息交换函数中将控件的值与控件id进行绑定,这样我们就可以更新或者获取控件的值)

1 void CMy0722ThreadTalkingDlg::DoDataExchange(CDataExchange* pDX)
2 {
3     CDialogEx::DoDataExchange(pDX);
4     DDX_Radio(pDX, IDC_RADIO1, m_radio);
5     DDX_Control(pDX, IDC_COMBO1, m_test);
6 }

 

  1 void CMy0722ThreadTalkingDlg::OnBnClickedButton1()
  2 {
  3       4     //创建线程
  5     if(!m_hThread)
  6     {
  7         m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//在线程创建之前创建事件
  8         //安全属性,(重置事件)人工为true,信号(false对应为无信号),事件名字(跨进程时可以使用));
  9         m_hThread = (HANDLE)_beginthreadex(NULL,0,&CMy0722ThreadTalkingDlg::ThreadProc,this,0,NULL);
 10 
 11     }
 12     
 13 }
 14 
 15  unsigned _stdcall CMy0722ThreadTalkingDlg::ThreadProc( void *  lpvoid)
 16  {
 17      CMy0722ThreadTalkingDlg *pthis = ( CMy0722ThreadTalkingDlg *)lpvoid;
 18      CString str;
 19      while(pthis->m_bFlagQuit)
 20      {
 21          //等事件
 22          if(WAIT_TIMEOUT ==  WaitForSingleObject(pthis->m_hEvent,100))
 23          {
 24              continue;
 25          }
 26          int nSum = 0;
 27          for(int i = 1;i <= pthis->m_nCalc;i++)
 28          {
 29              nSum+= i;
 30          }
 31 
 32         //第一种方式:事件 35          str.Format(_T("%d"),nSum);
 36          pthis->GetDlgItem(IDC_EDIT1)->SetWindowText(str);
 38 
 39      }
 40      return 0;
 41  }
 42 
 53 void CMy0722ThreadTalkingDlg::OnBnClickedButton2()
 54 {
 55     56     //计算
 57 //    m_radio = 1;
 58     //UpdateData( FALSE); //初始化对话框数据
 59     //获得要计算的值
 60     UpdateData(TRUE);  //从对话框上获得数据
 61     switch (m_radio)//此处用了组控件,但m_radio与tab键编号多少无关,仅是一句tab键的顺序从0开始编号(如tab键我们设置为123...,但m_radio的值仍是从0开始)
 62     {
 63     case 0:
 64         m_nCalc = 10;
 65         break;
 66     case 1:
 67         m_nCalc = 100;
 68         break;
 69     case 2:
 70         m_nCalc = 1000;
 71         break;
 72     default:
 73         break;
 74     }
 75     
 76 
 77     //将事件置为有信号
 78     SetEvent(m_hEvent);//先拿到值再将事件置为有信号
 79 
 80 }
 81 
 82 
 83 void CMy0722ThreadTalkingDlg::OnDestroy()
 84 {
 85     CDialogEx::OnDestroy();
 86 
 87     // TODO: 在此处添加消息处理程序代码
 88     m_bFlagQuit = false;
 89 
 90     if(m_hThread)
 91     {
 92         if(WAIT_TIMEOUT == WaitForSingleObject(m_hThread,100))
 93         {
 94             TerminateThread(m_hThread,-1);
 95         }
 96         CloseHandle(m_hThread);
 97         m_hThread = NULL;
 98 
 99     }
100 
101     if(m_hEvent)
102     {
103         CloseHandle(m_hEvent);
104         m_hEvent = NULL;
105     }
106 }

 

2.消息

  1 void CMy0722ThreadTalkingDlg::OnBnClickedButton1()
  2 {
  3     // TODO: 在此添加控件通知处理程序代码
  4     //创建线程
  5     if(!m_hThread)
  6     {
  7         m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//在线程创建之前创建事件
  8         //安全属性,(重置事件)人工为true,信号,名字);
  9         m_hThread = (HANDLE)_beginthreadex(NULL,0,&CMy0722ThreadTalkingDlg::ThreadProc,this,0,NULL);
 10 
 11     }
 12     
 13 }
 14 
 15  unsigned _stdcall CMy0722ThreadTalkingDlg::ThreadProc( void *  lpvoid)
 16  {
 17      CMy0722ThreadTalkingDlg *pthis = ( CMy0722ThreadTalkingDlg *)lpvoid;
 18      CString str;
 19      while(pthis->m_bFlagQuit)
 20      {
 21          //等事件
 22          if(WAIT_TIMEOUT ==  WaitForSingleObject(pthis->m_hEvent,100))
 23          {
 24              continue;
 25          }
 26          int nSum = 0;
 27          for(int i = 1;i <= pthis->m_nCalc;i++)
 28          {
 29              nSum+= i;
 30          }
 31 
 32          //第二种方式 消息--- 显示主窗口
 33          pthis->PostMessage(UM_MSG,nSum,0);
 34          
 38 
 39      }
 40      return 0;
 41  }
 42 
 43  LRESULT CMy0722ThreadTalkingDlg::OnMsg(WPARAM  wparam,LPARAM lparam)
 44  {
 45     CString str;
 46     str.Format(_T("%d"),wparam);
 47         
 48     GetDlgItem(IDC_EDIT1)->SetWindowText(str);
 49     //while(1);
 50      return 0;
 51  }
 52 
 53 void CMy0722ThreadTalkingDlg::OnBnClickedButton2()
 54 {
 55     // TODO: 在此添加控件通知处理程序代码
 56     //计算
 57 //    m_radio = 1;
 58     //UpdateData( FALSE); //初始化对话框数据
 59     //获得要计算的值
 60     UpdateData(TRUE);  //从对话框上获得数据
 61     switch (m_radio)
 62     {
 63     case 0:
 64         m_nCalc = 10;
 65         break;
 66     case 1:
 67         m_nCalc = 100;
 68         break;
 69     case 2:
 70         m_nCalc = 1000;
 71         break;
 72     default:
 73         break;
 74     }
 75     
 76 
 77     //将事件置为有信号
 78     SetEvent(m_hEvent);//先拿到值再将事件置为有信号
 79 
 80 }
 81 
 82 
 83 void CMy0722ThreadTalkingDlg::OnDestroy()
 84 {
 85     CDialogEx::OnDestroy();
 86 
 87     // TODO: 在此处添加消息处理程序代码
 88     m_bFlagQuit = false;
 89 
 90     if(m_hThread)
 91     {
 92         if(WAIT_TIMEOUT == WaitForSingleObject(m_hThread,100))
 93         {
 94             TerminateThread(m_hThread,-1);
 95         }
 96         CloseHandle(m_hThread);
 97         m_hThread = NULL;
 98 
 99     }
100 
101     if(m_hEvent)
102     {
103         CloseHandle(m_hEvent);
104         m_hEvent = NULL;
105     }
106 }

 

 

 

 https://www.cnblogs.com/itech/archive/2010/06/29/1767311.html

以上是关于windows下线程间的通信方式的主要内容,如果未能解决你的问题,请参考以下文章

线程间的通信方式以及线程与进程的区别

JAVA多线程之线程间的通信方式

线程间的通信同步方式与进程间通信方式

线程间的通信同步方式与进程间通信方式

线程间的通信 与 线程池

请教一个Linux下C语言的进程间的信号问题