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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM