![多線程編程之三——線程間通訊.doc_第1頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/939184c7-03f6-4ada-af79-5575da1c8dac/939184c7-03f6-4ada-af79-5575da1c8dac1.gif)
![多線程編程之三——線程間通訊.doc_第2頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/939184c7-03f6-4ada-af79-5575da1c8dac/939184c7-03f6-4ada-af79-5575da1c8dac2.gif)
![多線程編程之三——線程間通訊.doc_第3頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/939184c7-03f6-4ada-af79-5575da1c8dac/939184c7-03f6-4ada-af79-5575da1c8dac3.gif)
![多線程編程之三——線程間通訊.doc_第4頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/20/939184c7-03f6-4ada-af79-5575da1c8dac/939184c7-03f6-4ada-af79-5575da1c8dac4.gif)
全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
多線程編程之三線程間通訊.txt求而不得,舍而不能,得而不惜,這是人最大的悲哀。付出真心才能得到真心,卻也可能傷得徹底。保持距離也就能保護(hù)自己,卻也注定永遠(yuǎn)寂寞。七、線程間通訊一般而言,應(yīng)用程序中的一個(gè)次要線程總是為主線程執(zhí)行特定的任務(wù),這樣,主線程和次要線程間必定有一個(gè)信息傳遞的渠道,也就是主線程和次要線程間要進(jìn)行通信。這種線程間的通信不但是難以避免的,而且在多線程編程中也是復(fù)雜和頻繁的,下面將進(jìn)行說明。使用全局變量進(jìn)行通信由于屬于同一個(gè)進(jìn)程的各個(gè)線程共享操作系統(tǒng)分配該進(jìn)程的資源,故解決線程間通信最簡(jiǎn)單的一種方法是使用全局變量。對(duì)于標(biāo)準(zhǔn)類型的全局變量,我們建議使用volatile 修飾符,它告訴編譯器無需對(duì)該變量作任何的優(yōu)化,即無需將它放到一個(gè)寄存器中,并且該值可被外部改變。如果線程間所需傳遞的信息較復(fù)雜,我們可以定義一個(gè)結(jié)構(gòu),通過傳遞指向該結(jié)構(gòu)的指針進(jìn)行傳遞信息。 使用自定義消息我們可以在一個(gè)線程的執(zhí)行函數(shù)中向另一個(gè)線程發(fā)送自定義的消息來達(dá)到通信的目的。一個(gè)線程向另外一個(gè)線程發(fā)送消息是通過操作系統(tǒng)實(shí)現(xiàn)的。利用Windows操作系統(tǒng)的消息驅(qū)動(dòng)機(jī)制,當(dāng)一個(gè)線程發(fā)出一條消息時(shí),操作系統(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é)果。建立一個(gè)基于對(duì)話框的工程MultiThread7,在對(duì)話框IDD_MULTITHREAD7_DIALOG中加入三個(gè)單選按鈕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,屬性選中“邊框”; 在MultiThread7Dlg.h中定義如下變量: protected:int nAddend;代表加數(shù)的大小。分別雙擊三個(gè)單選按鈕,添加消息響應(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+2class CMultiThread7Dlg : public CDialog/ Constructionpublic:CMultiThread7Dlg(CWnd* pParent = NULL);/ standard constructorCCalculateThread* 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é)果。 雙擊按鈕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線程,延時(shí)給該線程發(fā)送WM_CALCULATE消息。 右擊工程并選中“New Class”為工程添加基類為 CWinThread 派生線程類 CCalculateThread。在文件CalculateThread.h 中添加 #define WM_CALCULATE WM_USER+1 class CCalculateThread : public CWinThreadprotected:afx_msg LONG OnCalculate(UINT wParam,LONG lParam);在文件CalculateThread.cpp中添加 LONG CCalculateThread:OnCalculate(UINT wParam,LONG lParam)int nTmpt=0;for(int i=0;iGetSafeHwnd(),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_MAPON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)/和主線程對(duì)比,注意它們的區(qū)別END_MESSAGE_MAP()在CalculateThread.cpp文件的開頭添加一條: #include MultiThread7Dlg.h以上代碼為CCalculateThread類添加了 WM_CALCULATE 消息,消息的響應(yīng)函數(shù)是 OnCalculate,其功能是根據(jù)參數(shù) wParam 的值,進(jìn)行累加,累加結(jié)果在臨時(shí)變量nTmpt中,延時(shí)0.5秒,向主線程發(fā)送WM_DISPLA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二級(jí)建造師合作合同樣本
- 互助市場(chǎng)拓展合作合同書
- 二手房屋購(gòu)買合同誠(chéng)意金約定
- 個(gè)人質(zhì)押與抵押合同
- XX公司員工培訓(xùn)合同協(xié)議
- 產(chǎn)品設(shè)計(jì)與研發(fā)合作合同范例
- 個(gè)人借款合同格式樣本
- 個(gè)體合作合同
- 個(gè)人股權(quán)轉(zhuǎn)讓合同范例()
- 中小企業(yè)投資合同協(xié)議書
- 【MOOC】數(shù)字?jǐn)z影技術(shù)與藝術(shù)-西南石油大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 2025檢驗(yàn)檢測(cè)中心年度工作總結(jié)及工作計(jì)劃
- 2024年總經(jīng)理助理年終工作總結(jié)(3篇)
- B區(qū)地下室碳纖維加固施工方案
- 三甲醫(yī)院臨床試驗(yàn)機(jī)構(gòu)-44 V00專業(yè)組SOP目錄
- 旅行社脫團(tuán)安全協(xié)議書范文模板
- 酒店工作安全培訓(xùn)(共60張課件)
- 2024年委托招商代理合同經(jīng)典版(三篇)
- 期中測(cè)試卷-2024-2025學(xué)年統(tǒng)編版語文五年級(jí)上冊(cè)
- 安全設(shè)施檢查維護(hù)保養(yǎng)記錄表
- 安裝承包免責(zé)協(xié)議書模板
評(píng)論
0/150
提交評(píng)論