




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第9章 多線程 內(nèi)容摘要:創(chuàng)建線程 實現(xiàn)線程間通信 利用線程同步技術(shù)保障數(shù)據(jù)安全 返回目錄第1頁,共41頁。9.1 創(chuàng)建線程 學習目標調(diào)用AfxBeginThread()來啟動線程。 9.1返回第9章第2頁,共41頁。程序的實現(xiàn)步驟利用AppWizard生成程序框架(ThreadTest )編輯資源 添加菜單響應(yīng)函數(shù) 編寫線程函數(shù) 在視中輸出信息9.1第3頁,共41頁。步驟1 生成程序框架(MenuTest)項目名稱: ThreadTest 選擇單文檔界面應(yīng)用程序(Single document)9.1第4頁,共41頁。步驟2 編輯資源1.編輯菜單資源 線程 Pop-up 選中 Caption
2、 ID 啟動線程 ID_THREAD_START 其他任務(wù) ID_TREEAD_OTHER2.編輯對話框資源 9.1IDD_DIALOG_THRAED CDlgThread 第5頁,共41頁。步驟3 添加菜單響應(yīng)函數(shù) Class Name Objects IDs MessagesCThreadTestView ID_THREAD_START COMMANDCThreadTestView ID_TREEAD_OTHER COMMAND9.1void CThreadTestView:OnThreadStart() HWND hWnd = GetSafeHwnd();AfxBeginThread(T
3、readProc, hWnd, THREAD_PRIORITY_NORMAL);void CThreadTestView:OnThraedOther() CDlgThread dlg;dlg.DoModal();第6頁,共41頁。步驟4 編寫線程函數(shù) 1. 在視類中添加兩個成員變量。并在構(gòu)造函數(shù)中初始化9.1class CThreadTestView : public CView public:CString m_strMessage;int m_iTime; CThreadTestView:CThreadTestView()m_strMessage = 沒有線程啟動;m_iTime = 0;
4、 第7頁,共41頁。步驟5 在視中輸出信息9.1void CThreadTestView:OnDraw(CDC* pDC)CThreadTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here char chNumber6;itoa(m_iTime, chNumber, 10);pDC-TextOut(30,30, m_strMessage);pDC-TextOut(30,50,chNumber);第8頁,共41頁。2. 線程函數(shù)9.1UINT TreadProc(LP
5、VOID param)CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp(); CMainFrame *pMainFrame = (CMainFrame *)pApp-GetMainWnd(); CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView();pView-m_strMessage = 啟動了一個線程!;while(pView-m_iTime m_iTime +;pView-Invalidate();pView-m_iTime =0;pView-m_st
6、rMessage = 線程結(jié)束!;return 0;第9頁,共41頁?;局RCWnd類的GetSafeHwnd();返回窗口句柄AfxBeginThread();線程函數(shù) ( 返回UINT) CMainFrame:GetActiveView();:Sleep(1000);9.1第10頁,共41頁。9.2 線程間通信 學習目標1. 使用全局變量實現(xiàn)線程間通信 2.使用消息實現(xiàn)線程間通信3.使用CEvent類實現(xiàn)線程間通信 9.2返回第9章第11頁,共41頁。1. 使用全局變量實現(xiàn)線程間通信在上一節(jié)程序的基礎(chǔ)上,進行以下操作:(1)在“線程”菜單中添加菜單項: “終止線程”,ID_THREAD_
7、STOP。(2)在ThreadTestView.cpp文件中添加一個全局變量threadController,用來控制線程是否繼續(xù)。添加方法是在ThreadTestView.cpp的最上面,在endif下面添加下面的語句:volatile int threadController;(3)在視類中為“停止線程”添加消息處理函數(shù)OnThreadStop ()。9.2void CThreadTestView:OnThreadStop() threadController = 0;第12頁,共41頁。1. 使用全局變量實現(xiàn)線程間通信4修改OnThreadStart ()函數(shù),代碼如下所示:9.2voi
8、d CThreadView:OnStartthread() threadController = 1;HWND hWnd = GetSafeHwnd();AfxBeginThread(TreadProc, hWnd, THREAD_PRIORITY_NORMAL);5修改ThreadProc()函數(shù)的代碼,代碼如下:第13頁,共41頁。9.2UINT TreadProc(LPVOID param)CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp(); CMainFrame *pMainFrame = (CMainFrame *)pApp-Get
9、MainWnd(); CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView();pView-m_strMessage = 啟動了一個線程!;while(threadController):Sleep(1000);pView-m_iTime +;pView-Invalidate();pView-m_iTime =0;pView-m_strMessage = 線程結(jié)束!;return 0; 第14頁,共41頁。2.使用消息實現(xiàn)線程間通信(1)在ThreadTestView.h文件中定義消息: const WM_T
10、HREAD_SENDMESS = WM_USER + 20;(2)在ThreadTestView.h文件中添加消息函數(shù)聲明:afx_msg int OnThreadSendmess();(3)在ThreadTestView.cpp文件中添加消息映射:ON_MESSAGE(WM_THREAD_SENDMESS, OnThreadSendmess)(4)OnThreadSendmess()代碼如下:9.2int CThreadTestView:OnThreadSendmess()m_iTime +;Invalidate(); return 0;第15頁,共41頁。2.使用消息實現(xiàn)線程間通信(5)修
11、改ThreadProc()函數(shù)如下 :9.2UINT TreadProc(LPVOID param)CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp(); CMainFrame *pMainFrame = (CMainFrame *)pApp-GetMainWnd(); CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView();pView-m_strMessage = 啟動了一個線程!;while(threadController):Sleep(1000);:
12、PostMessage(HWND)param, WM_THREAD_SENDMESS, 0, 0);pView-m_iTime =0;pView-m_strMessage = 線程結(jié)束!;return 0;第16頁,共41頁?;局RPostMessage(HWND)param, WM_THREAD_SENDMESS, 0, 0);4.5第17頁,共41頁。3.使用CEvent類實現(xiàn)線程間通信 (1)Event對象:有兩種狀態(tài):通信狀態(tài)和非通信狀態(tài)(2)創(chuàng)建一個CEvent類的對象很:CEvent threadStart; 他自動的處在未通信狀態(tài)(3)threadStart.SetEvent(
13、); 使其處于通信狀態(tài) (4)調(diào)用WaitForSingleObject()來監(jiān)視CEvent對象的::WaitForSingleObject(threadStart.m_hObject, INFINITE); 9.2第18頁,共41頁。3.使用CEvent類實現(xiàn)線程間通信 在上一節(jié)程序的基礎(chǔ)上,進行以下操作: (1)在ThreadTestView.cpp中:#include afxmt.h(2)在ThreadTestView.cpp中加上下列兩個全局變量:CEvent threadStart;CEvent threadEnd;(3)修改ThreadProc()函數(shù)(4)修改OnThreadS
14、tart ()函數(shù)中的內(nèi)容。 (5)修改OnThreadStop ()函數(shù)中的內(nèi)容。 (6)CThreadTestView添加WM_CREATE消息處理函數(shù)OnCreate()。 9.2void CThreadTestView:OnThreadStart() threadStart.SetEvent();void CThreadTestView:OnThreadStop() threadEnd.SetEvent();第19頁,共41頁。3.使用CEvent類實現(xiàn)線程間通信 9.2UINT TreadProc(LPVOID param)CThreadTestApp *pApp=(CThreadT
15、estApp *) AfxGetApp(); CMainFrame *pMainFrame = (CMainFrame *)pApp-GetMainWnd(); CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView(); :WaitForSingleObject(threadStart.m_hObject, INFINITE);pView-m_strMessage = 啟動了一個線程!;BOOL keepRunning = TRUE;while (keepRunning):Sleep(1000);int re
16、sult = :WaitForSingleObject(threadEnd.m_hObject, 0);if (result = WAIT_OBJECT_0)keepRunning = FALSE;:PostMessage(HWND)param, WM_THREAD_SENDMESS, 0, 0);pView-m_iTime =0;pView-m_strMessage = 線程結(jié)束!;return 0;第20頁,共41頁。3.使用CEvent類實現(xiàn)線程間通信 9.2int CThreadTestView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (C
17、View:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: Add your specialized creation code hereHWND hWnd = GetSafeHwnd();AfxBeginThread(TreadProc, hWnd, THREAD_PRIORITY_NORMAL);return 0;第21頁,共41頁。9.3 線程同步 學習目標1. 使用Critical Section實現(xiàn)線程同步 2. 使用互斥對象(mutex)實現(xiàn)線程同步 3. 使用信號量(semaphore實現(xiàn)線程同步 9.3返回第9章第22頁,共41頁。
18、9.3.1 使用Critical Section 1. CCriticalSection criticalSection;2. criticalSection.Lock(); /訪問前3. criticalSection.Unlock(); /訪問后9.3第23頁,共41頁。9.3.1 使用Critical Section 一個使用Critical Section 的線程安全類。 9.3#include afxmt.hclass CIntArrayprivate:int array10;CCriticalSection criticalSection;public:CIntArray();CI
19、ntArray() ;void SetArray(int value);void GetArray(int dstArray10);第24頁,共41頁。9.3.1 使用Critical Section 一個使用Critical Section 的線程安全類。 9.3#include stdafx.h#include IntArray.hCIntArray:CIntArray()CIntArray:CIntArray()void CIntArray:SetArray(int value)criticalSection.Lock();for (int x=0; x10; +x)arrayx = v
20、alue;criticalSection.Unlock();void CIntArray:GetArray(int dstArray10)criticalSection.Lock();for (int x=0; xGetMainWnd(); CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView();for(int i=1; iInvalidate();:Sleep(2000);return 0;第28頁,共41頁。9.3.1 使用Critical Section 9.3UINT ReadThreadProc(
21、LPVOID param)CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp();CMainFrame *pMainFrame = (CMainFrame *)pApp-GetMainWnd();CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView();while(1)intArray.GetArray(iArray1);pView-Invalidate();return 0;第29頁,共41頁。9.3.1 使用Critical Section 9.3void
22、CThreadView:OnStartthread() / TODO: Add your command handler code hereHWND hWnd = GetSafeHwnd();AfxBeginThread(WriteThreadProc, hWnd);AfxBeginThread(ReadThreadProc, hWnd);第30頁,共41頁。9.3.1 使用Critical Section 9.3void CThreadTestView:OnDraw(CDC* pDC)char str70;strcpy(str,線程 1 為數(shù)組設(shè)置的值是: );int len = strle
23、n(str);wsprintf(&strlen, %d , intSetNumber);pDC-TextOut(30,30,str);strcpy(str,線程 2 讀到的值是: );for (int i=0; iTextOut(30,50,str);第31頁,共41頁。9.3.2 使用使用Mutex(互斥對象) 將上例中的critical section替換成Mutex 9.3#include afxmt.hclass CIntArrayprivate:int array10;CMutex mutex;public:CIntArray (); CIntArray ();void SetArr
24、ay(int value);void GetArray(int dstArray10);第32頁,共41頁。9.3.2 使用使用Mutex(互斥對象) 9.3#include stdafx.h#include CIntArray.hCIntArray:CIntArray()CIntArray:CIntArray()void CIntArray:SetArray(int value)CSingleLock singleLock(&mutex);singleLock.Lock();for (int x=0; x10; +x)arrayx = value;void CIntArray:GetArra
25、y(int dstArray10)CSingleLock singleLock(&mutex);singleLock.Lock();for (int x=0; x10; +x)dstArrayx = arrayx; 第33頁,共41頁。9.3.3 使用信號量(Semaphore) (1)創(chuàng)建信號量CSemaphore Semaphore(2, 2);(2)創(chuàng)建一個CSingleLock對象 CSingleLock singleLock(semaphore);(3)減小信號量計數(shù)器 singleLock.Lock();(4)增加信號量計數(shù)器 singleLock.Unlock ();9.3第34
26、頁,共41頁。使用信號量的一個例子 1. 修改CIntArray類 9.3#include afxmt.hclass CIntArrayprivate:int array10;CMutex mutex;CSemaphore *semaphore;public:CIntArray (); CIntArray ();void SetArray(int value);void GetArray(int dstArray10);第35頁,共41頁。使用信號量的一個例子 1. 修改CIntArray類 9.3CIntArray:CIntArray() semaphore = new CSemaphore
27、(2, 2);CIntArray:CIntArray() delete semaphore;void CIntArray:SetArray(int value)CSingleLock singleLock(&mutex);singleLock.Lock();for (int x=0; x10; +x)arrayx = value;void CIntArray:GetArray(int dstArray10)CSingleLock singleLock(semaphore);singleLock.Lock();for (int x=0; xGetMainWnd();CThreadTestView *pView = (CThreadTestView *) pMainFrame-GetActiveView();while(1)intArray.GetArray(iArray2);pView-Invalidate();return 0;第39頁,共41頁。使用信號量的一個例子 9.3UINT ReadThreadProc3(LPVOID param)CThreadTestApp *pApp=(CThreadTes
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度車輛事故環(huán)境損害賠償協(xié)議
- 二零二五年度退租協(xié)議書及舊房裝修拆除工程合同
- 2025年度期刊發(fā)行權(quán)轉(zhuǎn)讓認刊書審核及執(zhí)行合同
- 二零二五年度房屋租賃合同租賃房屋租賃合同解除程序
- 二零二五年度品牌形象維護營銷人員保密及合作協(xié)議
- 2025年度科技研發(fā)領(lǐng)域自愿出資入股協(xié)議
- 2025年度貴金屬首飾典當借款服務(wù)協(xié)議
- 二零二五年度互聯(lián)網(wǎng)企業(yè)職工勞動合同優(yōu)化方案
- 二零二五年度電子行業(yè)經(jīng)典實習期勞動合同模板
- 《物流系統(tǒng)分析》課件 項目七任務(wù)四 了解物流系統(tǒng)仿真實踐
- 河北省職業(yè)院校技能大賽建筑信息模型建模與應(yīng)用(高職組)賽項參考試題及答案
- 艾滋病耐藥報告解讀
- 創(chuàng)新思維與創(chuàng)造力開發(fā)(山西經(jīng)貿(mào)職業(yè)學院)知到智慧樹答案
- 2024年濰坊護理職業(yè)學院單招職業(yè)適應(yīng)性測試題庫及答案解析
- 《西方經(jīng)濟學》(上冊)課程教案
- 2024年安徽省公務(wù)員錄用考試《行測》真題及答案解析
- 舞蹈學課件教學課件
- 施工合同協(xié)議書樣本
- 醫(yī)學綜合題庫(含答案)
- 2024年貴州省公務(wù)員考試《行測》真題及答案解析
- 工會一函兩書模板
評論
0/150
提交評論