版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Windows編程教案第一課 最簡單的Windows程序(2學時)Windows編程是一個很大的主題,涉及的方面也非常的多。Windows始于90年代,至今Windows編程的發(fā)展已經(jīng)非常成熟了,而單獨直接使用API的開發(fā)也是越來越少了。因此,市面上很少有泛泛的簡單入門級的Windows程序設(shè)計了。一個是系統(tǒng)級的Windows編程介紹,如Windows核心編程。一個是方向級的Windows編程介紹如Windows圖形編程,Windows網(wǎng)絡(luò)編程等等。我們這次課的主要參考用書是Windows核心編程,同時也參考了一些其他內(nèi)容。鑒于教材的價格較貴,同時也需要考慮我們自身的學習內(nèi)容不一定很多以及學時
2、的原因,就沒有定教材??次业慕贪赴?。(1) Win32 APIAPI : Application Program Interface。應(yīng)用程序接口。API就是在進行Windows編程時使用的函數(shù)庫。本課就是Windows編程=API+C語言(或者C+語言)(2) 開發(fā)環(huán)境我校機器上安裝了VC+ 6.0。相信這是大家一直以來學習C,C+使用的開發(fā)環(huán)境。但VC60離我們實在太遠了,它是一款90年代的產(chǎn)品,已經(jīng)近20年的歷史了。我們機器里還有VS2005 或 VS2008,那里面的C環(huán)境要比VC60強太多了,強烈建議大家使用更高級的平臺。本次授課的開發(fā)環(huán)境有兩個。一個是輕量級的DEV C+,一個是重
3、量級的VS2010.簡單程序我們都將用DEV C+來實現(xiàn)。DEV C+是一個非常小的C環(huán)境,但性能要優(yōu)于VC60,調(diào)試環(huán)境不如VC60。這個環(huán)境在我們的共享資源里有,大家可以下載安裝。安裝過程非常簡單,一直下一步即可。這是其主界面。(3) 最簡單的Windows程序提到最簡單的程序,幾乎所有的人都會想起經(jīng)典的HelloWorld。這不是Windows程序,如果在以前這叫DOS程序,現(xiàn)在叫Windows控制臺應(yīng)用程序。它不算Windows程序,但它很簡單的就把Helloword顯示到屏幕上了。而Windows程序要想把HelloWorld顯示在屏幕上就確實不容易了。3.1 訪問Helloworl
4、d網(wǎng)站,因為把Helloworld顯示在屏幕上并不容易,我們可以一點一點來,先讓Helloworld以文字形式出現(xiàn)在其他地方,這里我們通過訪問網(wǎng)站。把helloworld展現(xiàn)在網(wǎng)頁瀏覽器的地址欄上。真有這個網(wǎng)站嗎?唉,貌似還真有。運行程序,打開瀏覽器并訪問網(wǎng)站。這是Windows程序。Windows程序和我們以前的程序有什么不同呢?l Windows程序不能使用scanf,printf,cin,cout。所以輸出helloworld變得沒有以前容易了。l windows程序一定要#include <windows.h>l windows程序的主函數(shù)不是main,是WinMain。注
5、意區(qū)分大小寫。l 主函數(shù)的參數(shù)不一樣了int main(int argc ,char * argv)int WinMain(HINSTANCE hInstance, HINSTANCE,LPSTR lpStr,int nShow)絕大多數(shù)的人,初次接觸Windows編程都會被其冗長的名字所折服,啊,沒辦法,這就是Windows的命名規(guī)格,叫匈牙利命令法,是微軟的一個匈牙利籍的程序員發(fā)明的,它的作用的能夠讓變量,類型名能夠真實的反應(yīng)其代表的意義,這對英語人士自然很好。對英語不好的接受起來就有點難了。詳細解釋一下WinMain是Windows編程的主函數(shù)。一定注意大小寫啊。HINSTANCE,用W
6、indows的說法叫句柄數(shù)據(jù)類型。但它并不是一個新的數(shù)據(jù)類型,它是通過#define定義出來的。#define DECLARE_HANDLE(name) struct name#_int unused; typedef struct name#_ *nameDECLARE_HANDLE(HINSTANCE);上面兩行是windef.h中對HINSTANCE的定義。說到底HINSTANCE就是一個指針類型。LPSTR 是 typedef char * LPSTR。Windows編程里有大量通過#define和typedef定義出來的數(shù)據(jù)類型名。本質(zhì)上它們都不是新的東西,都是以前我們在C語言學過的
7、哪些數(shù)據(jù)類型另起了一個名字。為什么要這么做呢?一般Windows 程序比較大,好的命名利于維護和避免錯誤??傊?,說到底,舊壺裝新酒,貌似多了很多數(shù)據(jù)類型,不要被它們嚇到,它們就是比C語言你們學過的東西多穿了件馬甲。第二課 在窗口中顯示HelloWorld中(4學時)1、 第一課的HelloWorld出現(xiàn)在網(wǎng)頁上。這不是我們的目的,我們要生成正常一點的HelloWorld。Windows程序中要顯示HelloWorld看來還不是太容易。(1) 將HelloWorld繪制到桌面補充說明如果要讓這個程序順利執(zhí)行,需要寫的內(nèi)容是lgdi32運行的效果,helloworld顯示在桌面上了看到HelloW
8、orld了嗎。說明l WinMain是Window的主函數(shù)l HDC 是個什么呢,本質(zhì)上是個指針,但是我們不需要了解它指向了什么,因此,簡而化之HDC是一個32位的無符號整數(shù)。HDC叫設(shè)備上下文句柄。設(shè)備上下文指顯示器屏幕或打印機什么的。句柄有點類似文件句柄的意思,有了它才能操作設(shè)備。在這里有了它才能向設(shè)備上繪制。所有涉及繪圖的地方都涉及HDC。GetDC(窗口句柄)。如果使用GetDC(NULL)得到桌面的設(shè)備上下文。否則可以得到一個窗口的設(shè)備上下文,我們可以在窗口上進行繪制。(2) LPTSTR 是 TCHAR * 的另一個寫法(3) TextOut是Windows API的一個函數(shù),功能
9、是將文本寫到設(shè)備上下文上。 TextOut(HDC,橫坐標,縱坐標,字符串,字符串長度)(4) ReleaseDC(窗口句柄,HDC)釋放設(shè)備上下文 GetDC的得到的HDC一定要用ReleaseDC釋放,否則機器容易資源耗盡。2、 在一個獨立窗口中顯示HelloWorld,這是重點了,涉及一些Windows編程重要的內(nèi)容分如下幾個步驟(1) 定義一個全局函數(shù)(2) 定義WinMain函數(shù)(3) 在WinMain函數(shù)內(nèi)注冊窗口類lpszClassName:自己取個名字,字母lpfnWndProc:函數(shù)指針,為我們在第一步定義的函數(shù)名。用強制類型轉(zhuǎn)換在Windows中顯示一個窗口,一定要先注冊窗
10、口類。函數(shù)式RegisterClassEx(&wc)(4) 創(chuàng)建并顯示窗口(5) 建立消息循環(huán)(6) 補充處理WM_PAINT,補充WndProc函數(shù)總結(jié):創(chuàng)建窗口的模式是基本是固定的,本課的代碼很大一部分就是這么寫。主要在WndProc內(nèi)存在不同。涉及的API函數(shù)RegisterClassEx(&WNDCLASSEX)WinMain(HINSTACNE,HINSTANCE,LPSTR,int nShow)DefWindowProc(HWND,UINT,WPARAM,LPARAM)GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterM
11、in,UINT wMsgFilterMax).如果得到WM_QUIT返回0TranslateMessage(&MSG)DispathMessage(&MSG)BeginPaint(&PAINTSTRUCT)TextOut(HDC,INT,INT,LPSTR,INT)EndPaint(HWND,&PAINTSTRUCT)作業(yè):自己建立應(yīng)用,在窗口100,100位置顯示HelloWorld第三課 坐標位置及大小(4學時)在我們寫控制臺應(yīng)用的時候,不能自由的控制輸出顯示的位置。因此,沒有學習過這方面的內(nèi)容,現(xiàn)在我們創(chuàng)建了窗口,并且在窗口上顯示了Hello World。
12、這個過程涉及到很多涉及位置和大小的因素,如窗口的大小,顯示的位置,文字顯示的位置。說到位置,就涉及定位,說到定位就要說坐標系。在屏幕上顯示內(nèi)容涉及到坐標空間的知識。在Windows應(yīng)用中坐標空間分如下幾部分內(nèi)容1、 物理坐標空間物理坐標空間,指的是物理設(shè)備上對應(yīng)的坐標系。如顯示器坐標原點在左上角。如下是一個1024*768的屏幕物理坐標(0,0)(1024,0)(0,768)2、 設(shè)備坐標空間基于設(shè)備上下文指定的坐標空間。如窗口內(nèi)顯示的文本,使用的坐標就是基于窗口內(nèi)上下文的坐標??梢钥吹皆O(shè)備空間是物理空間體系的一個子空間。設(shè)備空間可以依賴于一個窗口。換句話可以把設(shè)備空間理解為在物理空間上顯示的
13、一個對象,其子空間。下面我們通過一個小例子理解物理空間和設(shè)備空間在窗口的標題條,以設(shè)備坐標,和物理坐標的形式顯示鼠標在窗口內(nèi)的位置WndProc處理消息循環(huán)WM_MOUSEMOVE,鼠標移動時消息標識,是個整數(shù)。其參數(shù)lParam,的第16位代表設(shè)備坐標中的X,高16位代表設(shè)備坐標的Y。POINT 是結(jié)構(gòu)體。只有x,y兩個成員ClientToScreen,將設(shè)備坐標轉(zhuǎn)換為屏幕坐標(物理坐標)sprintf:格式化字符串SetWindowText:設(shè)Window標題3、 頁面坐標空間(邏輯坐標空間的一種)作用,可以任意指定坐標原點,坐標軸方向,比例尺等信息??梢杂脕砼c設(shè)備無關(guān)的大小如厘米,毫米等
14、。頁面坐標叫窗口,其表示有原點(X,Y),寬度,高度組成(WIDTH,HEIGHT)設(shè)備坐標叫視口,其表示有原點(x,y),寬度,高度組成(width,height)頁面坐標和設(shè)備坐標的變換關(guān)系,大寫為設(shè)備坐標,小寫為頁面坐標PX=X+(px-x)*WIDTH/widthPY=Y+(py-y)*HEIGHT/heightpx=x+(PX-X)*width/WIDTHpy=y+(PY-Y)*heigh/HEIGHTGDI函數(shù)使用頁面坐標,顯示出來時是設(shè)備坐標通過對窗口,是否對應(yīng)的四個參數(shù)的設(shè)置,可以實現(xiàn)特殊的變換。頁面坐標是邏輯坐標的一種。在這個例子中我們一直使用MoveToEx(ps.hdc,
15、0,0,NULL); LineTo(ps.hdc,30,30);劃線,MoveToEx是把畫筆移動到指定位置(頁面坐標),LineTo是從畫筆所在位置到目標位置畫一條線。在這個例子中,每次劃線前通過設(shè)置視口,窗口結(jié)果使劃線的結(jié)果不同。這種形式的坐標轉(zhuǎn)換無法實現(xiàn)旋轉(zhuǎn)4、 世界坐標空間(邏輯坐標空間的另一種)功能:比頁面坐標空間方便,可以實現(xiàn)旋轉(zhuǎn)結(jié)構(gòu)體XFORMFLOAT eM11,FLOAT eM12,FLOAT eM21,FLOAT eM21,FLOAT eDx,FLOAT eDy,世界坐標到設(shè)備坐標的變換。小寫到大寫。PX=eM11*px+eM21*py+eDx;PY=eM12*px+eM2
16、2*py+eDy;默認為1,0,0,1,0,0 和設(shè)備坐標相同1001dxdymx00my00縮放-100-100映像旋轉(zhuǎn)cos(a),sin(a),-sin(a),cos(a),0,0順時針旋轉(zhuǎn)a度cos(a),-sin(a),sin(a),cos(a),0,0逆時針旋轉(zhuǎn)a度我們下面的例子通過Rectangle(ps.hdc,0,0,50,50);繪制50*50的矩形,用循環(huán)配合世界坐標變換繪制特殊的圖形 循環(huán)20次,每次旋轉(zhuǎn)坐標軸的方向,繪制正方形??偨Y(jié):物理坐標指的是屏幕坐標,不能改變坐標軸設(shè)備坐標指的是窗口坐標,不能改變坐標軸頁面坐標和世界坐標均是邏輯坐標,可以改變坐標軸,世界坐標功能
17、更強,可以旋轉(zhuǎn)。理解這些概念的繪圖是很重要的。相關(guān)函數(shù)BOOL ClientToScreen( HWND hWnd, LPPOINT lpPoint); 設(shè)備坐標轉(zhuǎn)屏幕坐標BOOL ScreenToClient( HWND hWnd, LPPOINT lpPoint);屏幕坐標轉(zhuǎn)設(shè)備坐標int MapWindowPoints( HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints); 各個窗口設(shè)備坐標之間的轉(zhuǎn)換BOOL SetWindowOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint )
18、;設(shè)置窗口的原點SetViewportOrgEx( HDC hdc, int X, int Y, LPPOINT lpPoint);設(shè)置視口的原點BOOL SetViewportExtEx( HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize);設(shè)置視口的width,heightBOOL SetWindowExtEx( HDC hdc, int nXExtent, int nYExtent, LPSIZE lpSize );設(shè)置窗口的width,heightSetMapMode設(shè)置頁面坐標的映射模式SetGraphicsMode設(shè)置世界坐標的映
19、射模式Rectangle繪制矩形,并填充內(nèi)部SetWorldTransform設(shè)置世界坐標變換LineTo:換線MoveToEx:移動畫筆SetWindowText設(shè)置窗口標題LPtoDP(hdc,LPPOINT,int)把邏輯坐標點轉(zhuǎn)換為設(shè)備坐標點作業(yè):使用movetoex,lineto,LPtoDP及世界坐標變換,繪制正六邊形提示:畫一條水平線后,將坐標原點移動到線的末尾,并將坐標軸旋轉(zhuǎn)60度*n,重復(fù)上步要將坐標移動到線尾需要使用LPtoDP第四課 色彩及繪制(6學時)(1)畫點像素:計算機屏幕上的一個點。是計算機屏幕顯示的最小單位。點的個數(shù)取決于計算機的分辨率。如1024*768,則屏
20、幕由1024*768個點組成。每個點都可以獨立的顯示一個顏色。計算機能夠表示的顏色有256*256*256=16777216種。顏色的表示 COLORREF 。定義顏色RGBCOLORREF color=RGB(紅,綠,藍)隨機繪制顏色點需要#include<cstdlib>srand:隨機種子函數(shù),傳遞的參數(shù)不同,可以生成不同的隨機數(shù)序列GetTickCount(): API函數(shù),得到系統(tǒng)開機后到現(xiàn)在的滴答數(shù),特點就是每次返回的結(jié)果不重復(fù)。兩者的配合得到不重復(fù)的隨機數(shù)序列rand得到函數(shù)SetPixel設(shè)置某點的顏色(2) 畫線在以前的例子里我們一直用1個像素寬的黑色實現(xiàn)來畫線。
21、現(xiàn)在我們學習創(chuàng)建畫筆,用畫筆來畫線。步驟 1、創(chuàng)建畫筆CreatePen(畫筆類型,寬度,顏色) 2、將畫筆選入設(shè)備上下文SelectObject 3、用畫筆繪制 4、將畫筆選出設(shè)備 5、刪除創(chuàng)建的畫筆對象SelectObject是將GDI對象畫筆選入設(shè)備上下文,并將當前的選出返回。因此我們兩次使用SelectObject,最后一個將以前的畫筆選入,返回我們創(chuàng)建的,并在下一步刪除畫筆。虛線只能支持寬度1.畫線函數(shù)Polygon(HDC,LPPOINT,INT).連接指定點,畫多邊形,封閉。如果畫4邊形則確認3個點即可。Polyline(HDC,LPPOINT,INT).連接指定點,畫多邊,不封
22、閉MoveToEx:移動畫筆LineTo:用當前的畫筆劃線Arc:畫圓弧 BOOL Arc( HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXStartArc, int nYStartArc, int nXEndArc, int nYEndArc );前4個是畫圓弧的矩形,后四個指定了弧開始和結(jié)束的位置作業(yè):畫一條正弦曲線使用SexPixel,LineTo,MoveToEx實現(xiàn)(3) 畫面畫面就是用畫刷來填充步驟 1、創(chuàng)建畫刷CreateSolidBrush(顏色) 2、將畫刷選入設(shè)備上下
23、文SelectObject 3、用畫刷填充 4、將畫刷選出設(shè)備 5、刪除創(chuàng)建的畫刷對象用藍色畫刷填充矩形,矩形的邊框是黑色。CreateSolidBrush:創(chuàng)建顏色畫刷Rectangle:繪制矩形,用當前的Pen繪制邊框,用當前的Brush來填充矩形內(nèi)部FillRect:畫刷填充矩形。FillRect(hdc,&RECT,HBRUSH)使用FillRect不繪制邊框,因為參數(shù)中有畫筆,也不用SelectObject了。Ellipse:橢圓,圓。畫邊框,填充Pie:圓餅(4) 位圖將文件系統(tǒng)中的位圖顯示到窗口中。繪制位圖步驟1、 根據(jù)現(xiàn)有的設(shè)備上下文創(chuàng)建兼容的設(shè)備上下文2、 加載位圖3
24、、 繪制圖像4、 刪除加載的位圖5、 刪除兼容的設(shè)備上下文BitBlt是在設(shè)備上下文之間拷貝圖像的函數(shù),非常常用在上一個列子的基礎(chǔ)上,得到位圖的大小并繪制實際大小的位圖作業(yè):在一個窗口上顯示一副位圖文件(*.bmp)。(5) 字體和文本創(chuàng)建邏輯字體并顯示文本步驟1、 創(chuàng)建邏輯字體2、 選入字體3、 輸出文本4、 選出字體5、 刪除字體另一個與文本繪制有關(guān)的功能更強的函數(shù)是DrawText總結(jié):本課介紹了一些基本的繪圖操作,其中涉及了較多的函數(shù),這里只是介紹了基本的使用方式和原理。函數(shù)srandrandGetClientRectSetPixelLineToMoveToExCreatePenCre
25、ateSolidBrushCreateFontIndirectBitBltSelectObjectDeleteObjectCreateCompatibleDCLoadImageRectangleFillRectDeleteDC等等。第五課 常用控件的使用(6學時)在上面的幾節(jié)課程中我們學習了如何建立Windows 應(yīng)用,并在圖形環(huán)境下繪制圖形。這些操作都是控制臺應(yīng)用中沒有的。本章我們介紹如何在窗口中加入按鈕等常規(guī)控件,并且處理它們。一般控件種類,按鈕,列表組合,編輯,列表,滾動條,靜態(tài)文本??丶且环N特殊的窗口。這些特殊窗口的類已經(jīng)由Windows系統(tǒng)注冊了,不需要我們注冊。這些類的名字分別為
26、。BUTTON,COMBOBOX,EDIT,LISTBOX,SCROLLBAR,STATIC(1) 創(chuàng)建任何時候均可,但通常在WM_CREATE事件中處理WM_CREATE是在窗口創(chuàng)建時觸發(fā)WM_DESTORY是在窗口銷毀時觸發(fā)控件用CreateWindow創(chuàng)建,返回控件窗體的句柄,窗體的類型一定為WS_CHILDWINDOW。附加的類型以或關(guān)系疊加。具體要參見MSDN(2) 操控控制這些控件是通過向這些控件的窗體句柄發(fā)送特點消息來實現(xiàn)的如 SendMessage(控件句柄,消息指,參數(shù)1,參數(shù)2)具體設(shè)置參見MSDN在上面的例子,我們處理下拉列表的時候使用了SendMessage發(fā)送消息(3
27、) 反饋我們操作控件會觸發(fā)控件的事件得到一些反饋,下面介紹如何得到這些反饋??傮w上,我們把這些反饋過程叫通知。通知的過程是將反饋發(fā)送給父窗體,一般父窗體有兩個事件接收控件的反饋WM_NOTIFY,WM_COMMAND。WM_COMMANDHIWORD(wParam)通知消息號LOWORD(wParam)控件標識WM_NOTIFYwParam :控件標識lParam:NHMDR的指針比如按鈕的單機對應(yīng)的事件是BN_CLICKED。該事件通過WM_COMMAND通知。我們把上個例子補充完整,并且為每個控件指定ID,指定的方式是在(HMENU)的后面寫個整數(shù),原則上應(yīng)該不同。HIWORD,得到一個字
28、的高字節(jié)。LOWORD得到一個字的低字節(jié)。(4) 通用控件我們上面介紹的是基本的控件,除了這些基本控件外還有一些通用控件。這些控件的使用和處理和基本的控件差不多,但功能更強大。ANIMATE_CLASS : 動畫控件,播放AVI動畫DATETIMEPICK_CLASS :日期時間下拉控件HOTKEY_CLASS :定義熱鍵的控件MONTHCAL_CLASS : 月份選擇控件PROGRESS_CLASS :進度條控件REBARCLASSNAME :rebar控件STATUSCLASSNAME:狀態(tài)條控件TOOLBARCLASSNAME :工具條TOOLTIPS_CLASS :提示控件TRACKB
29、AR_CLASS :軌跡條UPDOWN_CLASS :上下箭頭WC_COMBOBOXEX :組合框擴展WC_HEADER :頭控件WC_IPADDRESS :IP地址控件WC_LISTVIEW :listview控件WC_PAGESCROLLER :頁滾動控件WC_TABCONTROL :tabControl控件WC_TREEVIEW :樹視圖控件通用控件在使用前使用InitCommonControlsEx初始化。使用這些通用控件要include <commctrl.h>同時在連接時要連接 comctl32.dll頭部這些控件和IE有關(guān)系,根據(jù)IE版本不同,控件的外觀和功能有區(qū)別。
30、(5) 創(chuàng)建菜單CreateMenu:創(chuàng)建一個菜單CreatePopupMenu:創(chuàng)建一個子菜單AppendMenu:向菜單增加項目SetMenu:將菜單聯(lián)系到窗口第六課 進程及線程(2學時)l 進程:是一個正在運行的程序的實例。由兩個部分組成1、 一個是操作系統(tǒng)用來管理進行的內(nèi)核對象。內(nèi)核對象是系統(tǒng)用來存放關(guān)于進程信息的地方。2、 地址空間,每個進行都有自己的地址空間進程本身不執(zhí)行代碼,進程要至少擁有一個線程,由線程來執(zhí)行代碼。每個線程都擁有自己的CPU寄存器和堆棧。當創(chuàng)建一個進程時系統(tǒng)會自動創(chuàng)建一個主線程。CreateProcess創(chuàng)建進程 內(nèi)部執(zhí)行細節(jié):1 創(chuàng)建一個小的結(jié)構(gòu)存放進程信息
31、2 分配地址空間 3 創(chuàng)建一個小的結(jié)構(gòu)存放線程信息 4 執(zhí)行C/C+啟動代碼,最終會調(diào)用WinMain或main。結(jié)束一個進程 TerminateProcessTerminateProcess1 使用ToolHelp遍歷系統(tǒng)進程列舉系統(tǒng)全部的進程需要#include <Tlhelp32.h>#include <string>using namespace std;l 線程線程由兩個部分組成1 內(nèi)核對象2 線程堆棧,用于維護執(zhí)行代碼時所有的函數(shù)參數(shù)和局部變量進程是活波的,進程不執(zhí)行任何東西,它是線程的容器。線程在進程的地址空間中執(zhí)行代碼。如果一個進程擁有多個線程則這些線程
32、共享進程地址空間內(nèi)的代碼和數(shù)據(jù)。進程的地址空間要比線程占用更多的系統(tǒng)資源,因此要更多的使用線程。每個線程必須有個入口點函數(shù),主線程是main,WinMain。如果要創(chuàng)建一個線程,則這個線程的函數(shù)原型是這樣的。DWORD WINAPI ThreadProc(PVOID pvParm) return value;因為線程會共享全局變量,因此多線程應(yīng)該少使用全局變量1 線程創(chuàng)建 線程的創(chuàng)建不能直接使用CreateThread API函數(shù)。而要使用C編譯環(huán)境自帶的創(chuàng)建進程函數(shù)。#include <process.h>unsigned uThreadid=0;uintptr_t hThrea
33、d= _beginthreadex(NULL, 0,ThreadProc,NULL,CREATE_SUSPENDED,&uThreadid);第3個參數(shù)是線程函數(shù)地址,第4個參數(shù)是傳遞到線程的LPVOID,第5個參數(shù)為0線程馬上運行、CREATE_SUSPENDED需要激活才能運行。最后一個保存線程的ID進程和線程ID是一個標識。不重復(fù)。進程和線程對象是系統(tǒng)對象,關(guān)閉這些對象對進程和線程的運行沒有影響。第7課 線程的調(diào)度和同步(6學時)線程暫停: 創(chuàng)建時使用CREATE_SUSPENDED創(chuàng)建一個暫停的線程 使用SuspendThread暫停線程 長時間不使用窗體恢復(fù)線程: Resum
34、eThread ResumeThread和SuspendThread使用次數(shù)要對應(yīng)。休眠線程 Sleep(毫秒)線程的同步是比較容易出錯的地方,要多多實踐和理解。參見線程沖突的例子。每個線程對變量g累加10000次,創(chuàng)建6個線程,這是其中一次的運行結(jié)果??梢钥吹浇Y(jié)果不是60000.對線程沖突問題的解釋1條 C的g+對應(yīng)的匯編指令為3條mov eax,ginc eaxmov g,eax如果我們創(chuàng)建兩個線程,這兩個線程將共享上面的代碼。如果只有一個CPU的話,那同一時刻只能志執(zhí)行一條匯編指令。但Windows的調(diào)度機制可以保證代碼按順序執(zhí)行,但不能保證不被打斷。舉例g=0mov eax,g /1
35、eax=0inc eax /1 eax=1mov g,eax /1 g=1 eax=1mov eax,g /2 eax=1inc eax /2 eax=2mov g,eax /2 g=2 eax=21和2兩個線程分別執(zhí)行上面的3行代碼,則g被加了兩次,得到2。但實際上這是多線程的特例。真實的情況是CPU下條要執(zhí)行那個線程的代碼是隨機的。如下g=0mov eax,g /1 eax=0inc eax /1 eax=1mov eax,g /2 eax=0inc eax /2 eax=1mov g,eax /2 g=1 eax=1mov g,eax /1 g=1 eax=1線程1在增加后沒有及時賦值給g,然后線程2執(zhí)行。最后g為1。這就是線程沒有同步導致的問題,也是我們程序中出現(xiàn)的問題。解決方法(1)原子操作函數(shù)使用InterlockedExcha
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024秋二年級道德與法治上冊 第13課 我愛家鄉(xiāng)山和水說課稿 新人教版
- 8 《大衛(wèi)·科波菲爾(節(jié)選)》說課稿 2024-2025學年統(tǒng)編版高中語文選擇性必修上冊
- 4同學相伴(說課稿)-部編版道德與法治三年級下冊
- 2024-2025學年高中英語 Unit 6 At one with nature Period 2 Using language說課稿 外研版必修第一冊
- 計算機及外部設(shè)備維修服務(wù)項目融資渠道探索
- 二零二五年度土石方運輸與建筑廢棄物資源化利用合同
- 2024-2025學年新教材高中地理 第四章 水的運動 第一節(jié) 陸地水體及其相互關(guān)系說課稿 新人教版選修1
- 二零二五年度私立學校新生試讀期間家長參與協(xié)議
- 涂料購銷合同(2篇)
- 海上貨物運輸合同(2篇)
- 電器儀表人員培訓課件
- 2025年中小學春節(jié)安全教育主題班會課件
- 2023年工程制圖習題集
- 計量經(jīng)濟學練習題
- 2025年全國高考體育單招考試模擬政治試卷試題(含答案詳解)
- 傳統(tǒng)春節(jié)習俗
- 醫(yī)院消防安全知識培訓課件
- 反走私課件完整版本
- 四年級下冊數(shù)學知識點總結(jié)
- 第三屆全國石油工程設(shè)計大賽作品(油藏工程設(shè)計單項)
- (人衛(wèi)版第九版?zhèn)魅静W總論(一))課件
評論
0/150
提交評論