• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            yehao's Blog

            多線程編程之三——線程間通訊

            七、線程間通訊

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

            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作為參數傳遞。
            編譯并運行該例程,體會如何在線程間傳遞消息。

            posted on 2011-04-25 15:57 厚積薄發 閱讀(372) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            国产精品久久99| 91久久婷婷国产综合精品青草| 国产精品久久久亚洲| 国产精品久久久久jk制服| 成人妇女免费播放久久久| 99精品国产在热久久无毒不卡| 久久夜色tv网站| 久久精品国产亚洲Aⅴ香蕉| 合区精品久久久中文字幕一区| 久久综合久久美利坚合众国| 久久久久久久久久久久中文字幕 | 青青草国产成人久久91网| 国内精品久久人妻互换| 久久久无码精品亚洲日韩京东传媒| 国産精品久久久久久久| 国产精品美女久久久久AV福利| 亚洲乱亚洲乱淫久久| 热综合一本伊人久久精品| 久久久久久噜噜精品免费直播| 久久精品免费全国观看国产| 色综合久久无码中文字幕| 国产精品久久久久久久午夜片 | 2021最新久久久视精品爱| 亚洲性久久久影院| 久久亚洲精品成人无码网站| 久久丫精品国产亚洲av| 亚洲成人精品久久| 欧美国产成人久久精品| 国产成人精品久久二区二区| 热RE99久久精品国产66热| 99久久精品国产一区二区| 久久精品国产亚洲一区二区| 少妇无套内谢久久久久| 国产亚州精品女人久久久久久 | 久久国产一区二区| 久久久久免费视频| 狠狠狠色丁香婷婷综合久久五月| 亚洲午夜无码AV毛片久久| 日本精品久久久中文字幕 | 99999久久久久久亚洲| 亚洲中文精品久久久久久不卡|