• <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 厚積薄發 閱讀(366) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            少妇内射兰兰久久| 97精品国产97久久久久久免费| 成人妇女免费播放久久久| 久久精品无码一区二区WWW| 久久久青草久久久青草| 久久国产三级无码一区二区| 久久精品国产欧美日韩| 99蜜桃臀久久久欧美精品网站| 精品国产福利久久久| 日日狠狠久久偷偷色综合0| 国产精品一区二区久久不卡| 久久亚洲欧洲国产综合| 久久亚洲国产精品一区二区| 亚洲国产欧美国产综合久久| 亚洲午夜无码AV毛片久久| 国产激情久久久久影院小草| 久久精品国产亚洲精品2020| 国产精品永久久久久久久久久| 亚洲国产另类久久久精品小说| 久久99热这里只有精品国产| 99久久精品影院老鸭窝| 97精品伊人久久久大香线蕉| 手机看片久久高清国产日韩| 久久久久国色AV免费看图片| 国产91色综合久久免费分享| 久久天天躁狠狠躁夜夜网站 | 国产精品99久久久久久人| 亚洲伊人久久成综合人影院| 久久人人爽人人澡人人高潮AV| 久久中文娱乐网| 久久婷婷国产剧情内射白浆| 人妻精品久久久久中文字幕| 欧美精品九九99久久在观看| 久久久久久曰本AV免费免费| 成人综合伊人五月婷久久| 久久精品女人天堂AV麻| 亚洲av日韩精品久久久久久a| 久久精品国产亚洲一区二区| 欧美精品丝袜久久久中文字幕| 国产69精品久久久久9999APGF | 国产亚洲美女精品久久久久狼|