




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、多線程編程技術詳解第一講:線程基礎主講人:步磊峰主講人:步磊峰 UIPower 3D界面引擎負責人界面引擎負責人 第一節(jié):進程進程的概念進程是指在系統(tǒng)中正在運行的一個應用程序,在傳統(tǒng)的操作系統(tǒng)中,是資源的分配單位又是高度運行的單位。在現代操作系統(tǒng)中,進程是資源的分配單位,一個進程通常定義為程序的一個實例。在32位Windows中,進程占據4GB(2的32次方)的虛擬地址空間。第一節(jié):進程進程的組成部分進程由兩個部分組成:操作系統(tǒng)用來管理進程的內核對象。內核對象也是系統(tǒng)用來存放關于進程的統(tǒng)計信息的地方地址空間。它包含所有可執(zhí)行模塊或DLL模塊的代碼和數據。它還包含動態(tài)內存分配的空間。如線程堆棧和
2、堆分配空間第一節(jié):進程進程是不活潑的進程從來不執(zhí)行任何東西,它只是線程的容器。若要使進程完成某項操作,它必須擁有一個在它的環(huán)境中運行的線程,此線程負責執(zhí)行包含在進程的地址空間中的代碼。第一節(jié):進程進程中的線程單個進程可能包含若干個線程,這些線程都“同時” 執(zhí)行進程地址空間中的代碼。每個進程至少擁有一個線程,來執(zhí)行進程的地址空間中的代碼。當創(chuàng)建一個進程時,操作系統(tǒng)會自動創(chuàng)建這個進程的第一個線程,稱為主線程。此后,該線程可以創(chuàng)建其他的線程第二節(jié):線程線程的概念線程是指進程中執(zhí)行運行的最小單位,即處理機調度的基本單位。和進程相比,進程是一項任務,線程是獨立子任務,可由不同處理器分別來完成,提高了進程
3、運行速度。線程的組成部分線程由兩部分組成:a) 線程的內核對象,操作系統(tǒng)用它來對線程實施管理。內核對象也是系統(tǒng)用來存放線程統(tǒng)計信息的地方。b) 線程堆棧,它用于維護線程在執(zhí)行代碼時需要的所有參數和局部變量第二節(jié):線程線程的概念線程是指進程中執(zhí)行運行的最小單位,即處理機調度的基本單位。和進程相比,進程是一項任務,線程是獨立子任務,可由不同處理器分別來完成,提高了進程運行速度。線程的組成部分線程由兩部分組成:a) 線程的內核對象,操作系統(tǒng)用它來對線程實施管理。內核對象也是系統(tǒng)用來存放線程統(tǒng)計信息的地方。b) 線程堆棧,它用于維護線程在執(zhí)行代碼時需要的所有參數和局部變量第二節(jié):線程何時創(chuàng)建線程線程示
4、例比如:1)電子表格軟件可以在后臺執(zhí)行重新計算。2)Web瀏覽器可以在后臺與其服務器進行通信。在當前的結果顯示出來之前,用戶可以調整瀏覽器窗口的大小,或者轉到其他網站)。3)可以使用操作系統(tǒng)附帶的磁盤碎片整理程序,它是在系統(tǒng)空閑的時候,在后臺運行這個實用程序并進行磁盤碎片整理第二節(jié):線程何時不應該創(chuàng)建線程線程示例比如:1)開發(fā)一個字處理程序,并且希望允許打印函數在它自己的線程中運行第三節(jié):線程的創(chuàng)建 CreateThread HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize,LPTHR
5、EAD_START_ROUTINElpStartAddress, LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId); lpThreadAttributes 指向SECURITY_ATTRIBUTES型態(tài)的結構的指針,這個參數通常設置為NULLdwStackSize 設置初始棧的大小,以字節(jié)為單位,如果為0,那么默認將使用與調用該函數的線程相同的??臻g大小。任何情況下,Windows根據需要動態(tài)延長堆棧的大小第三節(jié):線程的創(chuàng)建 CreateThread lpStartAddress, 指向線程函數的指針,函數名稱沒有限制,但
6、是必須以下列形式聲明:DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正確將無法調用成功lpParameter, 向線程函數傳遞的參數,是一個指向結構的指針,不需傳遞參數時,為NULLdwCreationFlags, 線程標志,可取值如下(1)CREATE_SUSPENDED(0 x00000004):創(chuàng)建一個掛起的線程,(2)0:表示創(chuàng)建后立即激活。lpThreadId lpThreadId:保存新線程的id。 第三節(jié):線程的創(chuàng)建 注意事項如果你不需要線程ID,lpThreadId參數可以被設為NULL,但這只在WindowsNT中才行得通,Wind
7、ows95中就不行。如果你要寫一個程序可以在Windows 95中運行,不要把lpThreadId參數設為NULL。調用CreateThread時,系統(tǒng)會創(chuàng)建一個線程內核對象,這個線程內核對象不是線程本身,而是一個較小的數據結構,操作系統(tǒng)用這個結構來管理線程,可以把線程內核對象想象為一個由線程統(tǒng)計信息構成的小型數據結構。第四節(jié):線程的終止 線程的終止線程可以通過以下3種方法來終止運行 線程函數返回(這是強烈推薦的)。線程通過調用ExitThread函數“殺死”自己(要避免使用這種方法)1.同一個進程或另一個進程中的線程調用TerminateThread函數(要避免使用這種方法)第四節(jié):線程的終
8、止第一種:線程函數返回 設計線程函數時,應該讓線程自己返回,這樣可以確保以下正確的應用程序清理工作都得以執(zhí)行。 線程函數中創(chuàng)建的所有C+對象都通過其析構函數被正確銷毀。操作系統(tǒng)正確釋放線程棧使用的內存。操作系統(tǒng)把線程的退出代碼(在線程的內核對象中維護)設為線程函數的返回值1.系統(tǒng)遞減少線程的內核對象的使用計數。第四節(jié):線程的終止第二種:ExitThread函數 該函數將終止線程的運行,并導致操作系統(tǒng)清理該線程使用的所有操作系統(tǒng)資源。但是,你的C/C+資源(如C+類對象)不會被銷毀。有鑒于些,更好的做法是直接從線程函數返回,不要自己調用ExitThread函數第三種:TerminateThrea
9、d函數 不同于ExitThread總是”殺死“主調線程,TerminateThread能”殺死“任何線程。TerminateThread函數是異步的,所以函數返回時,并不保證線程已經終止了。第五節(jié):線程的掛起和恢復ResumeThread函數DWORD ResumeThread(HANDLE hThread); hThread 指定的要重新運行的線程的句柄如果ResumeThread函數成功,它將返回線程的前一個掛起計數,否則,它將返回0 xFFFFFFFF.一個線程可以被多次掛起。如果一個線程被掛起三次,那么必需調用ResumeThread三次,才能使起線程運行。第五節(jié):線程的掛起和恢復Su
10、spendThread函數DWORD SuspendThread(HANDLE hThread); hThread 指定的要掛起的線程的句柄如果SuspendThread函數成功,它將返回線程的前一個掛起計數,否則,它將返回0 xFFFFFFFF.在實際開發(fā)中,應用程序在調用SuspendThread時必需小心,因為試圖掛起一個線程時,我們不知道線程在做什么,比如說如果線程正在分配堆中的內存,線程將鎖定堆,當其他線程要訪問堆的時候,它們的執(zhí)行將被中止,直到第一個線程恢復。第六節(jié):線程睡眠Sleep函數使得線程在一段時間內自己不需要調度 void Sleep(DWORD dwMillisecon
11、ds); dwMilliseconds毫秒時間第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫ThreadDemo程序向導生成ThreadDemo控制臺程序打開vs2008編輯器選擇“文件”-“新建”-“項目”-彈出“新建項目對
12、話框”在“項目類型”下選擇“Win32”在右邊“模板下”選擇“Win32項目”在下面輸入項目的名稱:ThreadDemo選擇項目存放的位置然后點擊“確定“然后直接點擊”完成“,如圖第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫
13、ThreadDemo程序最終的程序效果第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫ThreadDemo程序修改背景顏色在MyRegisterClass函數里,修改代碼如下:wcex.hbrBackground= (HBRUS
14、H)(CTLCOLOR_BTN+1);第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫ThreadDemo程序禁用最大化按鈕在InitInstance函數里修改CreateWindow函數 hWnd = CreateWindow
15、(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW &WS_MAXIMIZEBOX, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);另一種方式:LONG lStyle = GetWindowLong(hWnd,GWL_STYLE);lStyle &= WS_MAXIMIZEBOX;SetWindowLong(hWnd,GWL_STYLE,lStyle);第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背
16、景顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫ThreadDemo程序創(chuàng)建三個線程在WM_CREATE消息里添加三個線程ThrHandle1 = CreateThread(NULL,0,ThreadProc1,NULL,CREATE_SUSPENDED,NULL);ThrHandle2 = CreateThread(NULL,0,
17、ThreadProc2,NULL,CREATE_SUSPENDED,NULL);ThrHandle3 = CreateThread(NULL,0,ThreadProc3,NULL,CREATE_SUSPENDED,NULL);定義三個全局的線程句柄,并初始化為NULLHANDLE ThrHandle1 = NULL; /線程的線程句柄HANDLE ThrHandle2 = NULL;/線程的線程句柄HANDLE ThrHandle3 = NULL;/線程的線程句柄第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景顏色4、禁用最大化窗口5
18、、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫ThreadDemo程序實現CreateEditControlForMainWnd函數創(chuàng)建編輯器控件 HWND CreateEditControlForMainWnd( int x, / horizontal position of window int y, / vertical position of wi
19、ndow int nWidth, / window width int nHeight, / window height HWND hWndParent, / handle to parent or owner window HINSTANCE hInstance / handle to application instance)return CreateWindow(_T(EDIT),_T(0),WS_CHILD | WS_VISIBLE,x,y,nWidth,nHeight,hWndParent,NULL,hInstance,NULL);第七節(jié):編寫ThreadDemo程序實現Create
20、StaticForMainWnd函數創(chuàng)建靜態(tài)控件void CreateStaticForMainWnd( LPCTSTR lpWindowName, / window nameint x, / horizontal position of windowint y, / vertical position of windowint nWidth, / window widthint nHeight, / window heightHWND hWndParent, / handle to parent or owner windowHINSTANCE hInstance / handle to a
21、pplication instance)CreateWindow(_T(STATIC),lpWindowName,WS_CHILD | WS_VISIBLE,x,y,nWidth,nHeight,hWndParent,NULL,hInstance,NULL);第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、
22、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫ThreadDemo程序在WM_CREATE消息里添加相關代碼創(chuàng)建三個靜態(tài)窗口、三個編輯器窗口第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫Thr
23、eadDemo程序添加菜單在“資源視圖”里添加“啟動”和“暫?!安藛?,設置”啟動“的ID號為IDM_RESUME,設置”暫?!暗腎D號為IDM_SUSPEN,并且在”Enabled“設為False,這樣在線程還沒有啟動時,暫停菜單是不可用的 如圖:在WM_CREATE消息里獲得菜單的句柄hMenu = GetMenu(hWnd);在WndProc函數內的開頭部分定義hMenu窗口的句柄,這里的句柄設為靜態(tài)的第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlF
24、orMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫ThreadDemo程序處理菜單消息EnableMenuItem函數用于設置菜單是可用的、或不可用的。DrawMenuBar 函數用于菜單欄發(fā)生改變的時候,重繪它ResumeThread 函數用于重新啟動線程SuspendThread 函數用于重新暫停線程如圖:第七節(jié):編寫ThreadDemo程序1、向導生成ThreadDemo控制臺程序2、最終的程序效果3、修改背景
25、顏色4、禁用最大化窗口5、創(chuàng)建三個線程6、實現CreateEditControlForMainWnd函數和CreateStaticForMainWnd函數 7、在WM_CREATE消息里添加相關代碼8、添加菜單9、處理菜單消息10、編寫線程函數11、處理WM_PAINT消息和WM_DESTROY消息第七節(jié):編寫ThreadDemo程序編寫線程函數線程函數形式DWORD WINAPI ThreadProc(LPVOIDlpParameter);當然,ThreadProc這個函數名是任意指定的,但是你不能去掉WINAPI這個符號,如果那樣,那么在你啟動線程后,線程就會墜毀。那WINAPI是什么呢,
26、其實WINAPI只是一種調用約定而已第七節(jié):編寫ThreadDemo程序編寫線程函數ThreadProc1線程函數1)首先獲得DC2)創(chuàng)建一個紅色的畫刷并選到DC里面去3)循環(huán)打印數字,當數字能被整除時,就畫一個硬幣4)在每次循環(huán)后都會調用Sleep睡眠毫秒,這是為了讓當前線程暫時放棄剩余的時間片,好讓其它線程可以執(zhí)行5)把舊的畫刷選回去,并刪除新的畫刷6)最后釋放DC代碼如下:第七節(jié):編寫ThreadDemo程序編寫線程函數ThreadProc1線程函數DWORD WINAPI ThreadProc1(LPVOID lpParameter)TCHAR szBuf10=0;int index
27、=0;/獲得DCHDC hdc = GetDC(hMainWnd);/創(chuàng)建一個紅色的畫刷并選到DC里面去HBRUSH hBr = CreateSolidBrush(RGB(255,0,0);HBRUSH hOldBr = static_cast(SelectObject(hdc,hBr);第七節(jié):編寫ThreadDemo程序編寫線程函數ThreadProc1線程函數/循環(huán)打印到的數字,并且當數字能被整除時,就畫一個硬幣for(int i=0; i1000; +i)wsprintf(szBuf,_T(%d),i+1);SetWindowText(ThrhWnd1,szBuf);if(0 = i%100)int y = 250 -10*index;Ellipse(hdc,100,y,200,y-30);Ellipse(hdc,100,y-10,200,y-36);index+;thrCoins1=index;Sleep(100);第七節(jié):編寫ThreadDemo程序編寫線程函數ThreadProc1線程函數/把舊的畫刷選回去,并刪除新的畫刷SelectObject(hdc,hOldBr);DeleteObject(hBr);/釋放DCReleaseDC(hMainWnd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年進口啤酒項目合作計劃書
- 水產養(yǎng)殖與生態(tài)農業(yè)綜合開發(fā)股權合作協(xié)議
- 智能合約區(qū)塊鏈電子證據收集與驗證補充協(xié)議
- 旅游團隊醫(yī)療保障補充合同
- 抖音平臺專業(yè)團購運營培訓全面服務合同
- 建筑施工企業(yè)安全風險評估與培訓服務協(xié)議
- 婚慶策劃影視廣告拍攝制作與愛情故事合同
- 新能源汽車電池回收與梯次利用市場拓展合作協(xié)議
- 金融機構間貨幣信貸補充協(xié)議
- 人與植物自然對話課件
- 2024年中考二模 歷史(四川成都卷)(考試版A4)
- 粉刷墻面施工協(xié)議書
- 輔導機構招聘合同協(xié)議
- 青年創(chuàng)新意識的培養(yǎng)試題及答案
- 客運車輛合伙經營合同6篇
- 2025屆陜西省安康市高三下學期適應性模擬考試歷史試題(原卷版+解析版)
- 《2025年CSCO腎癌診療指南》解讀課件
- 備戰(zhàn)2025年高考數學(新高考專用)搶分秘籍導數及其應用(九大題型)(學生版+解析)
- 村干部測試試題及答案
- 康復醫(yī)學教學課件 - 基礎醫(yī)學 - 醫(yī)藥衛(wèi)生 - 專業(yè)資料
- 寧波市余姚市交通運輸局招聘工作人員筆試真題2024
評論
0/150
提交評論