<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    多線程編程之 ---線程間通訊

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    下載源代碼

    七、線程通訊

      一般而言,應用程序中的一個次要線程總是為主線程執行特定的任務,這樣,主線程和次要線程間必定有一個信息傳遞的渠道,也就是主線程和次要線程間要進行通信。這種線程間的通信不但是難以避免的,而且在多線程編程中也是復雜和頻繁的,下面將進行說明。

    1. 使用全局變量進行通信

      由于屬于同一個進程的各個線程共享操作系統分配該進程的資源,故解決線程間通信最簡單的一種方法是使用全局變量。對于標準類型的全局變量,我們建議使用volatile 修飾符,它告訴編譯器無需對該變量作任何的優化,即無需將它放到一個寄存器中,并且該值可被外部改變。如果線程間所需傳遞的信息較復雜,我們可以定義一個結構,通過傳遞指向該結構的指針進行傳遞信息。
       
    2. 使用自定義消息

      我們可以在一個線程的執行函數中向另一個線程發送自定義的消息來達到通信的目的。一個線程向另外一個線程發送消息是通過操作系統實現的。利用Windows操作系統的消息驅動機制,當一個線程發出一條消息時,操作系統首先接收到該消息,然后把該消息轉發給目標線程,接收消息的線程必須已經建立了消息循環。

    例程7 MultiThread7

      該例程演示了如何使用自定義消息進行線程間通信。首先,主線程向CCalculateThread線程發送消息WM_CALCULATE,CCalculateThread線程收到消息后進行計算,再向主線程發送WM_DISPLAY消息,主線程收到該消息后顯示計算結果。

    1. 建立一個基于對話框的工程MultiThread7,在對話框IDD_MULTITHREAD7_DIALOG中加入三個單選按鈕IDC_RADIO1,IDC_RADIO2,IDC_RADIO3,標題分別為1+2+3+4+......+10,1+2+3+4+......+50,1+2+3+4+......+100。加入按鈕IDC_SUM,標題為“求和”。加入標簽框IDC_STATUS,屬性選中“邊框”;
    2. 在MultiThread7Dlg.h中定義如下變量:
      protected:
      	int nAddend;
      代表加數的大小。

      分別雙擊三個單選按鈕,添加消息響應函數:
      void CMultiThread7Dlg::OnRadio1() 
      {
      	nAddend=10;
      }
      
      void CMultiThread7Dlg::OnRadio2() 
      {
      	nAddend=50;
      	
      }
      
      void CMultiThread7Dlg::OnRadio3() 
      {
      	nAddend=100;
      	
      }
      并在OnInitDialog函數中完成相應的初始化工作
      BOOL CMultiThread7Dlg::OnInitDialog()
      {
      ……
      	((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
      	nAddend=10;
      ……
      在MultiThread7Dlg.h中添加:
      #include "CalculateThread.h"
      #define WM_DISPLAY WM_USER+2
      class CMultiThread7Dlg : public CDialog
      {
      // Construction
      public:
      	CMultiThread7Dlg(CWnd* pParent = NULL);	// standard constructor
      	CCalculateThread* m_pCalculateThread;
      ……
      protected:
      	int nAddend;
      	LRESULT OnDisplay(WPARAM wParam,LPARAM lParam);
      ……
      在MultiThread7Dlg.cpp中添加:
      BEGIN_MESSAGE_MAP(CMultiThread7Dlg, CDialog)
      ……
      	ON_MESSAGE(WM_DISPLAY,OnDisplay)
      END_MESSAGE_MAP()
      
      LRESULT CMultiThread7Dlg::OnDisplay(WPARAM wParam,LPARAM lParam)
      {
      	int nTemp=(int)wParam;
      	SetDlgItemInt(IDC_STATUS,nTemp,FALSE);
      
        return 0;
      
      }
      以上代碼使得主線程類CMultiThread7Dlg可以處理WM_DISPLAY消息,即在IDC_STATUS標簽框中顯示計算結果。
    3. 雙擊按鈕IDC_SUM,添加消息響應函數:
      void CMultiThread7Dlg::OnSum() 
      {
      	m_pCalculateThread=
      		(CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
      
      	Sleep(500);
      
      	m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);
      }
      OnSum()函數的作用是建立CalculateThread線程,延時給該線程發送WM_CALCULATE消息。
    4. 右擊工程并選中“New Class…”為工程添加基類為 CWinThread 派生線程類 CCalculateThread。

      在文件CalculateThread.h 中添加
      #define WM_CALCULATE WM_USER+1 
      class CCalculateThread : public CWinThread
      {
      ……
      protected:
      	afx_msg LONG OnCalculate(UINT wParam,LONG lParam);
      ……
      在文件CalculateThread.cpp中添加
      LONG CCalculateThread::OnCalculate(UINT wParam,LONG lParam)
      {
      	int nTmpt=0;
      	for(int i=0;i<=(int)wParam;i++)
      	{
      		nTmpt=nTmpt+i;
      	}
      
      	Sleep(500);
          ::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);
      
      	return 0;
      }
      BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)
      	//{{AFX_MSG_MAP(CCalculateThread)
      		// NOTE - the ClassWizard will add and remove mapping macros here.
      	//}}AFX_MSG_MAP
      	ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)
      //和主線程對比,注意它們的區別
      END_MESSAGE_MAP()
      在CalculateThread.cpp文件的開頭添加一條:
      #include "MultiThread7Dlg.h"
        以上代碼為 CCalculateThread 類添加了 WM_CALCULATE 消息,消息的響應函數是 OnCalculate,其功能是根據參數 wParam 的值,進行累加,累加結果在臨時變量nTmpt中,延時0.5秒,向主線程發送WM_DISPLAY消息進行顯示,nTmpt作為參數傳遞。
    編譯并運行該例程,體會如何在線程間傳遞消息。

    (未完待續)

    文章轉自:http://www.blogchinese.com/?uid-46225-action-viewspace-itemid-1244408

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全