• <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

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

            七、線程間通訊

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

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

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

              我們可以在一個線程的執(zhí)行函數(shù)中向另一個線程發(fā)送自定義的消息來達到通信的目的。一個線程向另外一個線程發(fā)送消息是通過操作系統(tǒng)實現(xiàn)的。利用Windows操作系統(tǒng)的消息驅(qū)動機制,當(dāng)一個線程發(fā)出一條消息時,操作系統(tǒng)首先接收到該消息,然后把該消息轉(zhuǎn)發(fā)給目標(biāo)線程,接收消息的線程必須已經(jīng)建立了消息循環(huán)。

            例程7 MultiThread7

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

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

              分別雙擊三個單選按鈕,添加消息響應(yīng)函數(shù):
              void CMultiThread7Dlg::OnRadio1()
                  {
                  nAddend=10;
                  }
                  void CMultiThread7Dlg::OnRadio2()
                  {
                  nAddend=50;
                  }
                  void CMultiThread7Dlg::OnRadio3()
                  {
                  nAddend=100;
                  }
              并在OnInitDialog函數(shù)中完成相應(yīng)的初始化工作:
              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標(biāo)簽框中顯示計算結(jié)果。
            3. 雙擊按鈕IDC_SUM,添加消息響應(yīng)函數(shù):
              void CMultiThread7Dlg::OnSum()
                  {
                  m_pCalculateThread=
                  (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));
                  Sleep(500);
                  m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);
                  }
              OnSum()函數(shù)的作用是建立CalculateThread線程,延時給該線程發(fā)送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)
                  //和主線程對比,注意它們的區(qū)別
                  END_MESSAGE_MAP()
                  
              在CalculateThread.cpp文件的開頭添加一條:
              #include "MultiThread7Dlg.h"
                  
                以上代碼為 CCalculateThread 類添加了 WM_CALCULATE 消息,消息的響應(yīng)函數(shù)是 OnCalculate,其功能是根據(jù)參數(shù) wParam 的值,進行累加,累加結(jié)果在臨時變量nTmpt中,延時0.5秒,向主線程發(fā)送WM_DISPLAY消息進行顯示,nTmpt作為參數(shù)傳遞。
            編譯并運行該例程,體會如何在線程間傳遞消息。

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

            導(dǎo)航

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

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            亚洲综合久久夜AV | 97超级碰碰碰久久久久| 欧美久久天天综合香蕉伊| 久久91精品综合国产首页| 色婷婷久久综合中文久久一本| 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲国产成人久久综合一区77| 伊人久久亚洲综合影院| 午夜不卡久久精品无码免费| 国产精品一久久香蕉国产线看 | 亚洲AV日韩精品久久久久久 | 精品国际久久久久999波多野| 青草影院天堂男人久久| 亚洲伊人久久成综合人影院| 成人国内精品久久久久影院| 亚洲精品NV久久久久久久久久 | 久久久久亚洲AV成人网人人网站 | 久久热这里只有精品在线观看| 欧美黑人又粗又大久久久| 久久亚洲精品无码播放| 2022年国产精品久久久久| 欧美久久久久久| 精品久久人人做人人爽综合| avtt天堂网久久精品| 久久久久久曰本AV免费免费| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲天堂久久久| 久久久99精品一区二区| 国产99久久久国产精品~~牛| 青青草原精品99久久精品66| 日韩久久无码免费毛片软件| 97久久精品人人澡人人爽| 久久精品国产亚洲欧美| 国产一级持黄大片99久久| 国产69精品久久久久APP下载| 亚洲精品乱码久久久久久不卡| 成人国内精品久久久久影院VR| 久久被窝电影亚洲爽爽爽| www.久久热| 91久久成人免费| 人人狠狠综合久久亚洲88|