• <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ù),這樣,主線程和次要線程間必定有一個信息傳遞的渠道,也就是主線程和次要線程間要進(jìn)行通信。這種線程間的通信不但是難以避免的,而且在多線程編程中也是復(fù)雜和頻繁的,下面將進(jìn)行說明。

            1. 使用全局變量進(jìn)行通信

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

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

            例程7 MultiThread7

              該例程演示了如何使用自定義消息進(jìn)行線程間通信。首先,主線程向CCalculateThread線程發(fā)送消息WM_CALCULATE,CCalculateThread線程收到消息后進(jìn)行計(jì)算,再向主線程發(fā)送WM_DISPLAY消息,主線程收到該消息后顯示計(jì)算結(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)簽框中顯示計(jì)算結(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 的值,進(jìn)行累加,累加結(jié)果在臨時變量nTmpt中,延時0.5秒,向主線程發(fā)送WM_DISPLAY消息進(jìn)行顯示,nTmpt作為參數(shù)傳遞。
            編譯并運(yùn)行該例程,體會如何在線程間傳遞消息。

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

            導(dǎo)航

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            久久国产精品无码一区二区三区| 色综合久久最新中文字幕| 午夜福利91久久福利| 亚洲精品国产第一综合99久久| 欧美激情一区二区久久久| 久久久久人妻精品一区| 久久国产精品免费一区二区三区 | 国产韩国精品一区二区三区久久| 国产国产成人久久精品| 国产精品乱码久久久久久软件| 99久久中文字幕| 亚洲国产成人久久综合区| 国内精品久久国产大陆| 亚洲AV伊人久久青青草原| 国产日产久久高清欧美一区| 午夜精品久久久久久影视777 | 国内精品久久久久影院网站| 久久AV无码精品人妻糸列| 久久久久久一区国产精品| www.久久热.com| 亚洲va中文字幕无码久久| 欧美精品丝袜久久久中文字幕 | 久久久无码精品亚洲日韩蜜臀浪潮 | 久久中文精品无码中文字幕 | 武侠古典久久婷婷狼人伊人| 精品午夜久久福利大片| 久久久女人与动物群交毛片| 无码任你躁久久久久久老妇App| 日韩欧美亚洲综合久久影院d3| 久久精品水蜜桃av综合天堂| 久久丫精品国产亚洲av不卡| 久久久久亚洲av综合波多野结衣| 日本欧美国产精品第一页久久| 久久se精品一区精品二区国产| 久久久久免费精品国产| 久久精品国产精品青草app| 成人妇女免费播放久久久| 久久精品中文騷妇女内射| AAA级久久久精品无码片| 国产99精品久久| a级毛片无码兔费真人久久|