久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

Windows編程知識(shí)點(diǎn)總結(jié)

時(shí)間:2019-05-15 13:19:11下載本文作者:會(huì)員上傳
簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《Windows編程知識(shí)點(diǎn)總結(jié)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《Windows編程知識(shí)點(diǎn)總結(jié)》。

第一篇:Windows編程知識(shí)點(diǎn)總結(jié)

1、基于MFC對(duì)話框程序的框架代碼主要由一下幾個(gè)部分組成:

A.應(yīng)用程序類

B.對(duì)話框類

C.資源文件

D.預(yù)編譯文件

2、Windows是建立在消息驅(qū)動(dòng)機(jī)制上的。

3、模態(tài)對(duì)話框運(yùn)行機(jī)制?

當(dāng)模態(tài)對(duì)話框產(chǎn)生后,應(yīng)用程序沒有處理消息,唯一的解釋就是模態(tài)對(duì)話框產(chǎn)生后會(huì)屏蔽其他窗體消息。事實(shí)也正是如此,創(chuàng)建模態(tài)對(duì)話框后,應(yīng)用程序只會(huì)響應(yīng)該對(duì)話框的消息,知道應(yīng)用收到結(jié)束模態(tài)對(duì)話框窗體的消息后,才會(huì)把控制權(quán)交還給應(yīng)用程序。

4、非模態(tài)對(duì)話框

與模態(tài)對(duì)話框不同,非模態(tài)對(duì)話框不會(huì)壟斷用戶的輸入,用戶任然可以使用其他窗體。

5、屬性對(duì)話框主要分為兩個(gè)部分:

A.屬性頁(yè)

B.屬性對(duì)話框架

6、屬性頁(yè)只是對(duì)話框的一種形式。

7、控件的邏輯順序決定著軟件中需要使用TAB進(jìn)行焦點(diǎn)切換時(shí)的順序排列。

8、控件按鈕有四種基本類型:

A.下壓按鈕

B.復(fù)選按鈕

C.單選按鈕

D.自繪按鈕

9、按鈕控件會(huì)向父窗口發(fā)出控件通知消息

A.BN_CLICKED:鼠標(biāo)單擊消息

B.BN_DOUBLECLICKED:鼠標(biāo)雙擊擊消息

C.BN_SETFOCUS:獲取用戶輸入焦點(diǎn)

D.BN_KILLFOCUS:失去用戶輸入焦點(diǎn)

10、在MFC環(huán)境下,除了使用CButton類本身的成員函數(shù)來(lái)操作按鈕控件,還可以使用窗體相關(guān)類的成員函數(shù),使用這些函數(shù)可以根據(jù)按鈕ID直接進(jìn)行操作。

11、MFC的CEdit類封裝了編輯框控件的基本操作。

12、UPPERCASES設(shè)置大寫,lowerCase設(shè)置小寫,Number設(shè)置只能接受數(shù)字,Password設(shè)置顯示為*。

13、MFC的CListBox類封裝了列表框控件的基本操作。

14、AddString:添加字符串列表項(xiàng)

DeleteString:刪除字符串列表項(xiàng)

Dir:從當(dāng)前目錄向列表框添加文件名

FindString:在列表框中查找包含指定前綴的第一個(gè)列表項(xiàng)

FindStringExact:在列表框中查找與指定字符串匹配的列表項(xiàng)

InsertString:向列表框中插入一個(gè)列表項(xiàng)

ResetContentp:清空編輯框和列表框的所有內(nèi)容

Selectstring:在列表框中查找字符串

15、組合框有三種模式:

簡(jiǎn)易式

下拉式

下拉列表式

16、組合框有兩種形式:

Dropdown樣式

Drop List樣式

17、MFC的CProgressCtrl類封裝了進(jìn)度條控件的基本操作。

18、tist->SetTimer(1,100,NULL)

設(shè)置計(jì)時(shí)器ID為1,每100ms觸發(fā)一次

19、tist->KillTimer(1)

關(guān)閉計(jì)時(shí)器120、列表控件有四種呈現(xiàn)方式:

圖標(biāo)視圖

小圖標(biāo)視圖

列表視圖

報(bào)表視圖

21、文檔視圖結(jié)構(gòu)是使用MFC開發(fā)基于文檔的應(yīng)用程序的基本框架,最主要的思想是數(shù)據(jù)的管理與顯示分離。

22視圖類CView23、使用AppWizard創(chuàng)建SDI和MDI的過程相似,主要區(qū)別是創(chuàng)建SDI時(shí)不生成CChildFrame類,CMainFrame的基類為CMainWnd;而創(chuàng)建MDI時(shí)會(huì)生成兩個(gè)框架類,一個(gè)是CMainFrame類,由CMDIFrameWnd類派生而來(lái),另一個(gè)是CChildFrame類,由CMDIChildWnd類派生而來(lái)

24、文檔與視圖體系

一個(gè)文檔可以對(duì)應(yīng)多個(gè)視圖,而一個(gè)視圖只能對(duì)應(yīng)一個(gè)文檔

文檔與視圖的結(jié)構(gòu)的優(yōu)勢(shì)在于數(shù)據(jù)的管理與顯示分離,在開發(fā)文檔/視圖體系開發(fā)應(yīng)用過程時(shí),涉及到:文檔模板、文檔、視圖、框架窗口

25、MFC的CView類是所有視圖類的基類,主要有兩大工能:

將與其相關(guān)聯(lián)文檔的數(shù)據(jù)呈現(xiàn)給用戶

接受用戶對(duì)數(shù)據(jù)的修改,并反饋給文檔

26、建立MFC單文檔應(yīng)用程序,實(shí)例項(xiàng)目名稱為“single”框架會(huì)自動(dòng)生成4個(gè)類:

CSingleApp類:應(yīng)用程序類

CMainFrame類:框架類

CSingleDoc文檔類

CSingleView類:視圖類

27、在MFC中使用GDI 進(jìn)行繪畫操作一般會(huì)涉及兩類對(duì)象:

設(shè)備上下文對(duì)象

GDI對(duì)象

28、設(shè)備上下文,是一種windows數(shù)據(jù)結(jié)構(gòu),它包含與設(shè)備繪制屬性相關(guān)的信息。

29、主要有一下幾種GDI 對(duì)象:

CPen對(duì)象:用來(lái)繪制線條

CBrush對(duì)象:用來(lái)填充繪制對(duì)象的內(nèi)部

CBitmap對(duì)象:用來(lái)操作位圖對(duì)象

CFont對(duì)象:用來(lái)繪制文本

CPalette對(duì)象:用于應(yīng)用程序和色彩輸出設(shè)備之間的接口

30、使用GDI進(jìn)行圖形繪制的一般流程:

創(chuàng)建GDI對(duì)象

創(chuàng)建獲取得設(shè)備上下文對(duì)象

使用SelectObject把GDI對(duì)象選入設(shè)備上下文

使用圖形輸出函數(shù)在指定上下文中繪制圖形

31、畫刷其實(shí)是一個(gè)像素大小為8*8的位圖,用多個(gè)相同的位圖對(duì)封圖形的內(nèi)部進(jìn)行填充

32、位圖

位圖是描述圖形最簡(jiǎn)單直觀的一種形式,把圖像橫向分為等間距的W列,縱向分為等間距的H列,于是這個(gè)圖形的大小被定義為分辨率W*H33、鍵盤上的每一個(gè)健都對(duì)應(yīng)一個(gè)唯一的掃描碼,在windows系統(tǒng)中為實(shí)現(xiàn)設(shè)備無(wú)關(guān)的要求,需要使用虛擬鍵值

34、當(dāng)有鍵盤事件發(fā)生時(shí),設(shè)備驅(qū)動(dòng)器首先獲取健的掃描碼,并轉(zhuǎn)換為虛擬鍵值

35、在應(yīng)用程序中響應(yīng)鍵盤消息有兩種方式:

響應(yīng)本進(jìn)程的鍵盤消息

響應(yīng)系統(tǒng)的鍵盤消息

36、keybd_event只是用于產(chǎn)生鍵盤事件,至于由誰(shuí)來(lái)處理他并不關(guān)心。系統(tǒng)捕捉到鍵盤事件后,會(huì)轉(zhuǎn)化為鍵盤消息的形式派發(fā)給當(dāng)前系統(tǒng)中擁有鍵盤輸入焦點(diǎn)的應(yīng)用程序。SendMessage和PostMasseage的區(qū)別在于,PostMasseage首先把消息發(fā)到指定句柄所在線程的消息隊(duì)列再由線程派發(fā)。SendMessage是把消息直接發(fā)送的指定句柄的窗體或控件。而往往很多情況下。指定句柄是個(gè)控件。而對(duì)控件的消息消息處理一般都是定義在主對(duì)話框上的。除非對(duì)其進(jìn)行子類化,如果使用SendMessage,消息就無(wú)法到達(dá)主對(duì)話框因而無(wú)法達(dá)到預(yù)期的效果。

37、TCP協(xié)議是一個(gè)面向連接的、可靠的協(xié)議,UDP協(xié)議是一個(gè)不可靠的、無(wú)連接的協(xié)議

38、因特網(wǎng)控制報(bào)文協(xié)議(Internet Control Message Protocol,ICMP)

39、套接字是一種網(wǎng)絡(luò)編程接口,提供了一種網(wǎng)絡(luò)數(shù)據(jù)發(fā)送和接受機(jī)制,套接字是網(wǎng)絡(luò)通信的基礎(chǔ),一個(gè)套接字表示通信的一端,使用套接字可以實(shí)現(xiàn)數(shù)據(jù)包在網(wǎng)絡(luò)上的傳輸。

40、soket函數(shù),用來(lái)根據(jù)指定的地址協(xié)議簇、套接字類型和協(xié)議類型創(chuàng)建一個(gè)套接字。

listen函數(shù),監(jiān)聽遠(yuǎn)程連接

accept函數(shù),用來(lái)接受客戶端連接。

sendto函數(shù),用來(lái)向指定地址發(fā)送數(shù)據(jù)。

recv函數(shù),用來(lái)在已建立連接的套接字上接收數(shù)據(jù)。

recvfrom函數(shù),用來(lái)在指定套接字上接收數(shù)據(jù)。

setsockopt函數(shù),用來(lái)設(shè)置套接字屬性。

41、進(jìn)程是一個(gè)正在運(yùn)行的程序的實(shí)例,有兩部分組成:

一個(gè)操作系統(tǒng)用來(lái)管理進(jìn)程的內(nèi)核對(duì)象。

創(chuàng)建時(shí)系統(tǒng)所分配的資源,主要是內(nèi)存地址單元。

41、進(jìn)程地址空間作為一個(gè)載體。包含進(jìn)城的所有數(shù)據(jù)和代碼以及堆和棧。為線程的運(yùn)行提供保障。

42、進(jìn)程是靜態(tài)的43、線程也有兩個(gè)部分組成:

線程內(nèi)核對(duì)象;線程堆棧。

44、線程是動(dòng)態(tài)的、可執(zhí)行的、它總是在某個(gè)進(jìn)程的環(huán)境中創(chuàng)建的。

45、每個(gè)線程都是運(yùn)行在其所屬進(jìn)程的地址空間,因此線程只能訪問本進(jìn)程的地址空間,而其他進(jìn)程對(duì)其是不可見的46、所謂‘頁(yè)’,只是操作系統(tǒng)為了更好的管理地址空間所產(chǎn)生的一個(gè)邏輯上的概念,把一個(gè)固定長(zhǎng)度的地址空間作為一個(gè)頁(yè),通常為4kb,系統(tǒng)在在對(duì)地址空間進(jìn)行管理時(shí),把每4kb的空間作為一個(gè)單位,最終形成內(nèi)存管理的多級(jí)索引結(jié)構(gòu)。

47、物理存儲(chǔ)器和進(jìn)程虛擬地址空間的映射是無(wú)序的,每一個(gè)進(jìn)程虛擬地址空間也只能由一個(gè)物理存儲(chǔ)器頁(yè)來(lái)映射。

48、“地址轉(zhuǎn)換機(jī)構(gòu)”就是負(fù)責(zé)他們彼此之間的關(guān)聯(lián)。

49、虛擬內(nèi)存也有三種基本狀態(tài):

空閑:地址空間沒有被占用,不能使用

保留:地址空間沒有被占用,但還沒有與物理存儲(chǔ)器相關(guān)聯(lián),不能使用。

提交:且已經(jīng)與物理存儲(chǔ)器相關(guān)聯(lián),可以使用。

50、內(nèi)存映射文件

內(nèi)存映射文件可以在進(jìn)程中保留一個(gè)地址空間區(qū)域,并把磁盤文件提交給該區(qū)域。一旦映射成功,就可以在內(nèi)存中直接操作文件,而不再需要使用readfile、writefile等文件操作API。

51、情況下會(huì)使用內(nèi)存映射文件:

系統(tǒng)使用內(nèi)存映射文件加載可執(zhí)行模塊(.exe)和動(dòng)態(tài)鏈接(DDL)

操作數(shù)據(jù)文件

共享內(nèi)存

52、消息傳遞

消息傳遞機(jī)制并不以進(jìn)程為界限,處理消息的是窗體,而與是否在同一進(jìn)程無(wú)關(guān)。因而在進(jìn)程間使用消息傳遞作為通信手段有個(gè)前提,即都是窗體應(yīng)用程序。

53、共享內(nèi)存的原理

使用內(nèi)存共享機(jī)制,在任何一個(gè)進(jìn)程內(nèi)創(chuàng)建內(nèi)存映射,卻能夠在其他多個(gè)進(jìn)程中使用。這些進(jìn)程共享的是物理內(nèi)存器的同一個(gè)頁(yè)面,把這些物理內(nèi)存映射到虛擬內(nèi)存時(shí)各個(gè)進(jìn)程的虛擬地址不一定相同。當(dāng)一個(gè)進(jìn)程將數(shù)據(jù)寫入共享內(nèi)存時(shí),其他進(jìn)程可以立即獲取數(shù)據(jù)變更情況,顯然這種共享內(nèi)存的方式是完全可以滿足在進(jìn)程間進(jìn)行大數(shù)據(jù)快速傳輸任務(wù)要求的。

54、與內(nèi)存映射磁盤文件一樣,共享內(nèi)存的本質(zhì)也是內(nèi)存映射機(jī)制。

55、使用系統(tǒng)頁(yè)文件支持的內(nèi)存映射文件,及共享內(nèi)存。

56、進(jìn)程間通信的三種基本方法:匿名管道、命名管道、郵槽

57、管道是用于進(jìn)程間通信的共享內(nèi)存區(qū)域。創(chuàng)建管道的進(jìn)程稱為管道服務(wù)器,而連接這兩個(gè)管道的進(jìn)程稱為管道客戶端,一個(gè)進(jìn)程向管道寫入信息,另外一個(gè)進(jìn)程從管道讀取信息

58、匿名管道

匿名管道是基于字符和半雙工的,一般用于程序輸入輸出的重定向。如果需要獲取一個(gè)基于控制臺(tái)窗口應(yīng)用程序的輸出,此時(shí)就可以是用匿名管道,首先使用CreatePipe函數(shù)創(chuàng)建匿名管道。

59、命名管道的特征:

命名管道是雙向的,進(jìn)程間可以使用同一管道進(jìn)行交互

命名管道不但可以面向字節(jié)流,還可以面向消息。所以讀取進(jìn)行可以讀取寫進(jìn)程發(fā)送的不同長(zhǎng)度的消息

多個(gè)獨(dú)立的管道實(shí)例可以用同一個(gè)名稱來(lái)命名。

命名管道可以用于網(wǎng)絡(luò)間兩個(gè)進(jìn)程的通信,而其實(shí)現(xiàn)過程與本地進(jìn)程通信完全一致

60、創(chuàng)建命名管道使用CreateNamedPipe函數(shù)

61、郵槽是實(shí)現(xiàn)單通道的進(jìn)程間通信的通信方式。創(chuàng)建郵槽的進(jìn)程稱為郵槽服務(wù)器,向郵槽發(fā)送消息的進(jìn)程稱為郵槽客戶端

60、創(chuàng)建郵槽使用CreateMailslot函數(shù)

61、windows剪貼板是一種比較簡(jiǎn)單同時(shí)也是開銷比較小的進(jìn)程間通信方式。

62、剪貼板通信機(jī)制

windows系統(tǒng)支持剪貼板IPC的基本機(jī)制室友系統(tǒng)預(yù)留的一塊全局共享內(nèi)存,可用于被各個(gè)進(jìn)程暫時(shí)存儲(chǔ)數(shù)據(jù)。寫入進(jìn)程首先穿件一個(gè)全局內(nèi)存塊,并將數(shù)據(jù)寫到該內(nèi)存塊;接受數(shù)據(jù)的進(jìn)程通過剪貼板機(jī)制獲取此內(nèi)存塊的句柄,并完成對(duì)該內(nèi)存塊數(shù)據(jù)的讀取。

63、剪貼板通信有5種基本情況:

文本剪貼板

位圖剪貼板

自定義格式

延遲提交

多項(xiàng)數(shù)據(jù)

63、進(jìn)程同步可分為兩大類:

訪問共享資源,多個(gè)進(jìn)程訪問進(jìn)程共享資源時(shí),需要確保資源不受破壞。

事件通知,一個(gè)線程完成某項(xiàng)任務(wù)后通知其他線程。

64、原子訪問,是指線程對(duì)共享資源的獨(dú)占式訪問。

65、關(guān)鍵代碼段,是指在執(zhí)行前首先去的對(duì)共享資源的訪問權(quán),然后讓代碼以原子操作方式執(zhí)行來(lái)訪問共享資源的一種方法。

66、內(nèi)核對(duì)象等待函數(shù),其所等待的也正是內(nèi)核對(duì)象的受信狀態(tài)。

67、內(nèi)核對(duì)象本質(zhì)上只是一個(gè)內(nèi)存塊。

68、內(nèi)核對(duì)象是操作系統(tǒng)對(duì)資源進(jìn)行管理的單位。

69、內(nèi)核對(duì)象有兩種狀態(tài):已通知狀態(tài)、未通知狀態(tài)

70、在所有內(nèi)核對(duì)象中,事件內(nèi)核對(duì)象是最基本的對(duì)象,事件內(nèi)核對(duì)象有兩種狀態(tài):已通知狀態(tài)、未通知狀態(tài)。在多線程環(huán)境先經(jīng)常使用事件內(nèi)核對(duì)象的這種特性實(shí)現(xiàn)線程同步。

71、事件內(nèi)核對(duì)象有兩種基本類型:手動(dòng)重置事件、自動(dòng)重置事件。

72、等待定時(shí)器內(nèi)核對(duì)象是可以在某個(gè)指定時(shí)間或者以規(guī)定的間隔發(fā)出通知信號(hào)的內(nèi)核對(duì)象,一般在某個(gè)線程需要定時(shí)執(zhí)行某項(xiàng)功能時(shí)用這種內(nèi)核對(duì)項(xiàng)

73、信標(biāo)內(nèi)核對(duì)項(xiàng)常用于在多線程環(huán)境下控制某類資源的使用,使用信標(biāo)內(nèi)核對(duì)象可以讓系統(tǒng)自動(dòng)地維護(hù)資源的數(shù)量,并合理的控制線程對(duì)資源的訪問情況。

74、信標(biāo)的出色之處在于它們能夠以原子操作方式來(lái)執(zhí)行測(cè)試和設(shè)置操作,當(dāng)向信標(biāo)申請(qǐng)一個(gè)資源時(shí),操作系統(tǒng)就要檢驗(yàn)是否有這個(gè)資源可供使用,同時(shí)將可用資源的數(shù)量遞減,而不讓另一個(gè)線程加以干擾。只有當(dāng)資源數(shù)量遞減后,系統(tǒng)才允許另一個(gè)線程申請(qǐng)對(duì)資源的訪問權(quán)。

75、如果線程需要訪問該資源就要先獲取互斥對(duì)象,所有線程都應(yīng)遵循這個(gè)規(guī)則。

76、動(dòng)態(tài)鏈接庫(kù)(DLL)是Windows操作系統(tǒng)的基礎(chǔ),所有API函數(shù)都包含在DLL中。應(yīng)用程序并不是只有一個(gè)可執(zhí)行程序,而是由一個(gè)可執(zhí)行模塊和若干個(gè)DLL模塊組成。當(dāng)執(zhí)行應(yīng)用程序時(shí),系統(tǒng)會(huì)把與可執(zhí)行模塊相鏈接的DLL模塊加載到當(dāng)前進(jìn)程地址空間。

77、動(dòng)態(tài)鏈接庫(kù)(DLL)的最大特性是支持動(dòng)態(tài)載入。

78、要產(chǎn)生可執(zhí)行文件有兩個(gè)步驟:

1)編譯過程。編譯源碼,為每個(gè)C/C++源文件生成一個(gè).obj模塊,由編譯器完成。

2)鏈接過程。把應(yīng)用程序的各個(gè).obj模塊鏈接起來(lái)產(chǎn)生.exe文件,有鏈接器完成。

79、DLL隱式鏈接,是指在鏈接過程中,把應(yīng)用程序所需要DLL模塊的名字和輸入符號(hào)都記錄下來(lái),使得應(yīng)用程序在運(yùn)行時(shí)可以動(dòng)態(tài)載入該DLL。

80、與隱式鏈接相比,顯示加載DLL主要有以下幾個(gè)特性:

1)顯示加載的DLL并不會(huì)在應(yīng)用程序初始化時(shí)就加載,而是在運(yùn)行時(shí)根據(jù)需要調(diào)用LoadLibrary或LoadLibraryEx函數(shù)來(lái)加載。

2)在應(yīng)用程序輸入表中沒有記錄。

3)隱式鏈接的前提是需要有DLL所對(duì)應(yīng)的lib文件,如果沒有l(wèi)ib文件就無(wú)法進(jìn)行隱式鏈接。顯示加載就沒有這個(gè)限制。

81、DllMain函數(shù)是DLL的可選入口。

82、線程本地存儲(chǔ)器(TLS)的主要作用是可以避免多個(gè)線程同時(shí)訪問同一全局或者靜態(tài)變量時(shí)導(dǎo)致的沖突。

83、TLS有兩種使用方法:靜態(tài)TLS和動(dòng)態(tài)TLS。

84、結(jié)構(gòu)異常處理有三種基本的使用方法,分別是結(jié)束異常程序、異常處理程序和頂層異常處理。

85結(jié)構(gòu)化異常處理(SEH)是被作為一種系統(tǒng)機(jī)制引入到操作系統(tǒng)中的。

86、可執(zhí)行文件格式(PE),其格式中得分?jǐn)?shù)據(jù)結(jié)構(gòu)通常定義在winnt.h中。

第二篇:Windows編程教案

Windows編程教案

第一課

最簡(jiǎn)單的Windows程序(2學(xué)時(shí))

Windows編程是一個(gè)很大的主題,涉及的方面也非常的多。Windows始于90年代,至今Windows編程的發(fā)展已經(jīng)非常成熟了,而單獨(dú)直接使用API的開發(fā)也是越來(lái)越少了。因此,市面上很少有泛泛的簡(jiǎn)單入門級(jí)的Windows程序設(shè)計(jì)了。一個(gè)是系統(tǒng)級(jí)的Windows編程介紹,如Windows核心編程。一個(gè)是方向級(jí)的Windows編程介紹如Windows圖形編程,Windows網(wǎng)絡(luò)編程等等。我們這次課的主要參考用書是Windows核心編程,同時(shí)也參考了一些其他內(nèi)容。鑒于教材的價(jià)格較貴,同時(shí)也需要考慮我們自身的學(xué)習(xí)內(nèi)容不一定很多以及學(xué)時(shí)的原因,就沒有定教材??次业慕贪赴伞?/p>

(1)Win32 API API : Application Program Interface。應(yīng)用程序接口。API就是在進(jìn)行Windows編程時(shí)使用的函數(shù)庫(kù)。本課就是

Windows編程=API+C語(yǔ)言(或者C++語(yǔ)言)(2)開發(fā)環(huán)境

我校機(jī)器上安裝了VC++ 6.0。相信這是大家一直以來(lái)學(xué)習(xí)C,C++使用的開發(fā)環(huán)境。但VC60離我們實(shí)在太遠(yuǎn)了,它是一款90年代的產(chǎn)品,已經(jīng)近20年的歷史了。我們機(jī)器里還有VS2005 或 VS2008,那里面的C環(huán)境要比VC60強(qiáng)太多了,強(qiáng)烈建議大家使用更高級(jí)的平臺(tái)。本次授課的開發(fā)環(huán)境有兩個(gè)。一個(gè)是輕量級(jí)的DEV C++,一個(gè)是重量級(jí)的VS2010.簡(jiǎn)單程序我們都將用DEV C++來(lái)實(shí)現(xiàn)。

DEV C++是一個(gè)非常小的C環(huán)境,但性能要優(yōu)于VC60,調(diào)試環(huán)境不如VC60。這個(gè)環(huán)境在我們的共享資源里有,大家可以下載安裝。安裝過程非常簡(jiǎn)單,一直下一步即可。

這是其主界面。

(3)最簡(jiǎn)單的Windows程序

提到最簡(jiǎn)單的程序,幾乎所有的人都會(huì)想起經(jīng)典的HelloWorld。

這不是Windows程序,如果在以前這叫DOS程序,現(xiàn)在叫Windows控制臺(tái)應(yīng)用程序。它不算Windows程序,但它很簡(jiǎn)單的就把Helloword顯示到屏幕上了。而Windows程序要想把HelloWorld顯示在屏幕上就確實(shí)不容易了。

3.1 訪問Helloworld網(wǎng)站,因?yàn)榘袶elloworld顯示在屏幕上并不容易,我們可以一點(diǎn)一點(diǎn)來(lái),先讓Helloworld以文字形式出現(xiàn)在其他地方,這里我們通過訪問網(wǎng)站www.tmdps.cnE,HINSTANCE,LPSTR,int nShow)DefWindowProc(HWND,UINT,WPARAM,LPARAM)GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax).如果得到WM_QUIT返回0 TranslateMessage(&MSG)DispathMessage(&MSG)BeginPaint(&PAINTSTRUCT)TextOut(HDC,INT,INT,LPSTR,INT)EndPaint(HWND,&PAINTSTRUCT)作業(yè):

自己建立應(yīng)用,在窗口100,100位置顯示HelloWorld 第三課 坐標(biāo)位置及大小(4學(xué)時(shí))

在我們寫控制臺(tái)應(yīng)用的時(shí)候,不能自由的控制輸出顯示的位置。因此,沒有學(xué)習(xí)過這方面的內(nèi)容,現(xiàn)在我們創(chuàng)建了窗口,并且在窗口上顯示了Hello World。這個(gè)過程涉及到很多涉及位置和大小的因素,如窗口的大小,顯示的位置,文字顯示的位置。說到位置,就涉及定位,說到定位就要說坐標(biāo)系。在屏幕上顯示內(nèi)容涉及到坐標(biāo)空間的知識(shí)。在Windows應(yīng)用中坐標(biāo)空間分如下幾部分內(nèi)容

1、物理坐標(biāo)空間

物理坐標(biāo)空間,指的是物理設(shè)備上對(duì)應(yīng)的坐標(biāo)系。如顯示器

坐標(biāo)原點(diǎn)在左上角。如下是一個(gè)1024*768的屏幕物理坐標(biāo)(0,0)(1024,0)

(0,768)

2、設(shè)備坐標(biāo)空間

基于設(shè)備上下文指定的坐標(biāo)空間。如窗口內(nèi)顯示的文本,使用的坐標(biāo)就是基于窗口內(nèi)上下文的坐標(biāo)。

可以看到設(shè)備空間是物理空間體系的一個(gè)子空間。設(shè)備空間可以依賴于一個(gè)窗口。換句話可以把設(shè)備空間理解為在物理空間上顯示的一個(gè)對(duì)象,其子空間。下面我們通過一個(gè)小例子理解物理空間和設(shè)備空間

在窗口的標(biāo)題條,以設(shè)備坐標(biāo),和物理坐標(biāo)的形式顯示鼠標(biāo)在窗口內(nèi)的位置

WndProc處理消息循環(huán)

WM_MOUSEMOVE,鼠標(biāo)移動(dòng)時(shí)消息標(biāo)識(shí),是個(gè)整數(shù)。其參數(shù)lParam,的第16位代表設(shè)備坐標(biāo)中的X,高16位代表設(shè)備坐標(biāo)的Y。POINT 是結(jié)構(gòu)體。只有x,y兩個(gè)成員 ClientToScreen,將設(shè)備坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)(物理坐標(biāo))sprintf:格式化字符串

SetWindowText:設(shè)Window標(biāo)題

3、頁(yè)面坐標(biāo)空間(邏輯坐標(biāo)空間的一種)

作用,可以任意指定坐標(biāo)原點(diǎn),坐標(biāo)軸方向,比例尺等信息。可以用來(lái)與設(shè)備無(wú)關(guān)的大小如厘米,毫米等。

頁(yè)面坐標(biāo)叫窗口,其表示有原點(diǎn)(X,Y),寬度,高度組成(WIDTH,HEIGHT)設(shè)備坐標(biāo)叫視口,其表示有原點(diǎn)(x,y),寬度,高度組成(width,height)

頁(yè)面坐標(biāo)和設(shè)備坐標(biāo)的變換關(guān)系,大寫為設(shè)備坐標(biāo),小寫為頁(yè)面坐標(biāo)

PX=X+(px-x)*WIDTH/width PY=Y+(py-y)*HEIGHT/height

px=x+(PX-X)*width/WIDTH py=y+(PY-Y)*heigh/HEIGHT

GDI函數(shù)使用頁(yè)面坐標(biāo),顯示出來(lái)時(shí)是設(shè)備坐標(biāo)

通過對(duì)窗口,是否對(duì)應(yīng)的四個(gè)參數(shù)的設(shè)置,可以實(shí)現(xiàn)特殊的變換。頁(yè)面坐標(biāo)是邏輯坐標(biāo)的一種。在這個(gè)例子中我們一直使用 MoveToEx(ps.hdc,0,0,NULL);

LineTo(ps.hdc,30,30);劃線,MoveToEx是把畫筆移動(dòng)到指定位置(頁(yè)面坐標(biāo)),LineTo是從畫筆所在位置到目標(biāo)位置畫一條線。

在這個(gè)例子中,每次劃線前通過設(shè)置視口,窗口結(jié)果使劃線的結(jié)果不同。這種形式的坐標(biāo)轉(zhuǎn)換無(wú)法實(shí)現(xiàn)旋轉(zhuǎn)

4、世界坐標(biāo)空間(邏輯坐標(biāo)空間的另一種)功能:比頁(yè)面坐標(biāo)空間方便,可以實(shí)現(xiàn)旋轉(zhuǎn) 結(jié)構(gòu)體 XFORM{ FLOAT eM11, FLOAT eM12, FLOAT eM21, FLOAT eM21, FLOAT eDx, FLOAT eDy, } 世界坐標(biāo)到設(shè)備坐標(biāo)的變換。小寫到大寫。PX=eM11*px+eM21*py+eDx;PY=eM12*px+eM22*py+eDy;默認(rèn)為{1,0,0,1,0,0} 和設(shè)備坐標(biāo)相同 {1001dxdy} {mx00my00}縮放 {-100-100}映像

旋轉(zhuǎn){cos(a),sin(a),-sin(a),cos(a),0,0}順時(shí)針旋轉(zhuǎn)a度 {cos(a),-sin(a),sin(a),cos(a),0,0}逆時(shí)針旋轉(zhuǎn)a度

我們下面的例子通過Rectangle(ps.hdc,0,0,50,50);繪制50*50的矩形,用循環(huán)配合世界坐標(biāo)變換繪制特殊的圖形

循環(huán)20次,每次旋轉(zhuǎn)坐標(biāo)軸的方向,繪制正方形??偨Y(jié):

物理坐標(biāo)指的是屏幕坐標(biāo),不能改變坐標(biāo)軸 設(shè)備坐標(biāo)指的是窗口坐標(biāo),不能改變坐標(biāo)軸

頁(yè)面坐標(biāo)和世界坐標(biāo)均是邏輯坐標(biāo),可以改變坐標(biāo)軸,世界坐標(biāo)功能更強(qiáng),可以旋轉(zhuǎn)。理解這些概念的繪圖是很重要的。

相關(guān)函數(shù)

BOOL ClientToScreen(HWND hWnd, LPPOINT lpPoint);設(shè)備坐標(biāo)轉(zhuǎn)屏幕坐標(biāo)

BOOL ScreenToClient(HWND hWnd,LPPOINT lpPoint);屏幕坐標(biāo)轉(zhuǎn)設(shè)備坐標(biāo) int MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints);

各個(gè)窗口設(shè)備坐標(biāo)之間的轉(zhuǎn)換

BOOL SetWindowOrgEx(HDC hdc, int X,int Y,LPPOINT lpPoint);設(shè)置窗口的原點(diǎn)

SetViewportOrgEx(HDC hdc,int X,int Y,LPPOINT lpPoint);設(shè)置視口的原點(diǎn)

BOOL SetViewportExtEx(HDC hdc, int nXExtent, int nYExtent,LPSIZE lpSize);設(shè)置視口的width,height BOOL SetWindowExtEx(HDC hdc, int nXExtent,int nYExtent, 設(shè)置窗口的width,height SetMapMode設(shè)置頁(yè)面坐標(biāo)的映射模式 SetGraphicsMode設(shè)置世界坐標(biāo)的映射模式 Rectangle繪制矩形,并填充內(nèi)部 SetWorldTransform設(shè)置世界坐標(biāo)變換 LineTo:換線

MoveToEx:移動(dòng)畫筆

SetWindowText設(shè)置窗口標(biāo)題

LPtoDP(hdc,LPPOINT,int)把邏輯坐標(biāo)點(diǎn)轉(zhuǎn)換為設(shè)備坐標(biāo)點(diǎn) 作業(yè):

使用movetoex,lineto,LPtoDP及世界坐標(biāo)變換,繪制正六邊形

LPSIZE lpSize);

提示:

畫一條水平線后,將坐標(biāo)原點(diǎn)移動(dòng)到線的末尾,并將坐標(biāo)軸旋轉(zhuǎn)60度*n,重復(fù)上步 要將坐標(biāo)移動(dòng)到線尾需要使用LPtoDP

第四課 色彩及繪制(6學(xué)時(shí))

(1)畫點(diǎn)

像素:計(jì)算機(jī)屏幕上的一個(gè)點(diǎn)。是計(jì)算機(jī)屏幕顯示的最小單位。點(diǎn)的個(gè)數(shù)取決于計(jì)算機(jī)的分辨率。如1024*768,則屏幕由1024*768個(gè)點(diǎn)組成。每個(gè)點(diǎn)都可以獨(dú)立的顯示一個(gè)顏色。計(jì)算機(jī)能夠表示的顏色有256*256*256=16777216種。顏色的表示 COLORREF。定義顏色RGB COLORREF color=RGB(紅,綠,藍(lán))隨機(jī)繪制顏色點(diǎn)

需要#include srand:隨機(jī)種子函數(shù),傳遞的參數(shù)不同,可以生成不同的隨機(jī)數(shù)序列

GetTickCount(): API函數(shù),得到系統(tǒng)開機(jī)后到現(xiàn)在的滴答數(shù),特點(diǎn)就是每次返回的結(jié)果不重復(fù)。

兩者的配合得到不重復(fù)的隨機(jī)數(shù)序列

rand得到函數(shù)

SetPixel設(shè)置某點(diǎn)的顏色

(2)畫線

在以前的例子里我們一直用1個(gè)像素寬的黑色實(shí)現(xiàn)來(lái)畫線?,F(xiàn)在我們學(xué)習(xí)創(chuàng)建畫筆,用畫筆來(lái)畫線。

步驟

1、創(chuàng)建畫筆CreatePen(畫筆類型,寬度,顏色)

2、將畫筆選入設(shè)備上下文SelectObject

3、用畫筆繪制

4、將畫筆選出設(shè)備

5、刪除創(chuàng)建的畫筆對(duì)象

SelectObject是將GDI對(duì)象畫筆選入設(shè)備上下文,并將當(dāng)前的選出返回。因此我們兩次使用SelectObject,最后一個(gè)將以前的畫筆選入,返回我們創(chuàng)建的,并在下一步刪除畫筆。

虛線只能支持寬度1.畫線函數(shù)

Polygon(HDC,LPPOINT,INT).連接指定點(diǎn),畫多邊形,封閉。如果畫4邊形則確認(rèn)3個(gè)點(diǎn)即可。

Polyline(HDC,LPPOINT,INT).連接指定點(diǎn),畫多邊,不封閉 MoveToEx:移動(dòng)畫筆

LineTo:用當(dāng)前的畫筆劃線

Arc:畫圓弧 BOOL Arc(HDC hdc, int nLeftRect, int nTopRect, int nRightRect,int nBottomRect, int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc);前4個(gè)是畫圓弧的矩形,后四個(gè)指定了弧開始和結(jié)束的位置 作業(yè):畫一條正弦曲線

使用SexPixel,LineTo,MoveToEx實(shí)現(xiàn)

(3)畫面

畫面就是用畫刷來(lái)填充 步驟

1、創(chuàng)建畫刷CreateSolidBrush(顏色)

2、將畫刷選入設(shè)備上下文SelectObject

3、用畫刷填充

4、將畫刷選出設(shè)備

5、刪除創(chuàng)建的畫刷對(duì)象

用藍(lán)色畫刷填充矩形,矩形的邊框是黑色。CreateSolidBrush:創(chuàng)建顏色畫刷

Rectangle:繪制矩形,用當(dāng)前的Pen繪制邊框,用當(dāng)前的Brush來(lái)填充矩形內(nèi)部 FillRect:畫刷填充矩形。FillRect(hdc,&RECT,HBRUSH)

使用FillRect不繪制邊框,因?yàn)閰?shù)中有畫筆,也不用SelectObject了。Ellipse:橢圓,圓。畫邊框,填充 Pie:圓餅(4)位圖

將文件系統(tǒng)中的位圖顯示到窗口中。繪制位圖步驟

1、根據(jù)現(xiàn)有的設(shè)備上下文創(chuàng)建兼容的設(shè)備上下文

2、加載位圖

3、繪制圖像

4、刪除加載的位圖

5、刪除兼容的設(shè)備上下文

BitBlt是在設(shè)備上下文之間拷貝圖像的函數(shù),非常常用

在上一個(gè)列子的基礎(chǔ)上,得到位圖的大小并繪制實(shí)際大小的位圖 作業(yè):

在一個(gè)窗口上顯示一副位圖文件(*.bmp)。(5)字體和文本

創(chuàng)建邏輯字體并顯示文本 步驟

1、創(chuàng)建邏輯字體

2、選入字體

3、輸出文本

4、選出字體

5、刪除字體

另一個(gè)與文本繪制有關(guān)的功能更強(qiáng)的函數(shù)是DrawText 總結(jié):本課介紹了一些基本的繪圖操作,其中涉及了較多的函數(shù),這里只是介紹了基本的使用方式和原理。函數(shù) srand rand GetClientRect SetPixel LineTo MoveToEx CreatePen CreateSolidBrush CreateFontIndirect BitBlt SelectObject DeleteObject CreateCompatibleDC LoadImage Rectangle FillRect DeleteDC 等等。

第五課 常用控件的使用(6學(xué)時(shí))

在上面的幾節(jié)課程中我們學(xué)習(xí)了如何建立Windows 應(yīng)用,并在圖形環(huán)境下繪制圖形。這些操作都是控制臺(tái)應(yīng)用中沒有的。本章我們介紹如何在窗口中加入按鈕等常規(guī)控件,并且處理它們。

一般控件種類,按鈕,列表組合,編輯,列表,滾動(dòng)條,靜態(tài)文本??丶且环N特殊的窗口。這些特殊窗口的類已經(jīng)由Windows系統(tǒng)注冊(cè)了,不需要我們注冊(cè)。這些類的名字分別為。

BUTTON,COMBOBOX,EDIT,LISTBOX,SCROLLBAR,STATIC(1)創(chuàng)建

任何時(shí)候均可,但通常在WM_CREATE事件中處理

WM_CREATE是在窗口創(chuàng)建時(shí)觸發(fā) WM_DESTORY是在窗口銷毀時(shí)觸發(fā)

控件用CreateWindow創(chuàng)建,返回控件窗體的句柄,窗體的類型一定為WS_CHILDWINDOW。附加的類型以或關(guān)系疊加。具體要參見MSDN(2)操控

控制這些控件是通過向這些控件的窗體句柄發(fā)送特點(diǎn)消息來(lái)實(shí)現(xiàn)的 如 SendMessage(控件句柄,消息指,參數(shù)1,參數(shù)2)具體設(shè)置參見MSDN 在上面的例子,我們處理下拉列表的時(shí)候使用了SendMessage發(fā)送消息(3)反饋

我們操作控件會(huì)觸發(fā)控件的事件得到一些反饋,下面介紹如何得到這些反饋。總體上,我們把這些反饋過程叫通知。通知的過程是將反饋發(fā)送給父窗體,一般父窗體有兩個(gè)事件接收控件的反饋

WM_NOTIFY,WM_COMMAND。WM_COMMAND HIWORD(wParam)通知消息號(hào) LOWORD(wParam)控件標(biāo)識(shí) WM_NOTIFY wParam :控件標(biāo)識(shí) lParam:NHMDR的指針

比如按鈕的單機(jī)對(duì)應(yīng)的事件是BN_CLICKED。該事件通過WM_COMMAND通知。

我們把上個(gè)例子補(bǔ)充完整,并且為每個(gè)控件指定ID,指定的方式是在(HMENU)的后面寫個(gè)整數(shù),原則上應(yīng)該不同。

HIWORD,得到一個(gè)字的高字節(jié)。LOWORD得到一個(gè)字的低字節(jié)。(4)通用控件

我們上面介紹的是基本的控件,除了這些基本控件外還有一些通用控件。這些控件的使用和處理和基本的控件差不多,但功能更強(qiáng)大。ANIMATE_CLASS : 動(dòng)畫控件,播放AVI動(dòng)畫 DATETIMEPICK_CLASS :日期時(shí)間下拉控件 HOTKEY_CLASS :定義熱鍵的控件 MONTHCAL_CLASS : 月份選擇控件 PROGRESS_CLASS :進(jìn)度條控件 REBARCLASSNAME :rebar控件 STATUSCLASSNAME:狀態(tài)條控件 TOOLBARCLASSNAME :工具條 TOOLTIPS_CLASS :提示控件 TRACKBAR_CLASS :軌跡條 UPDOWN_CLASS :上下箭頭

WC_COMBOBOXEX :組合框擴(kuò)展 WC_HEADER :頭控件

WC_IPADDRESS :IP地址控件 WC_LISTVIEW :listview控件

WC_PAGESCROLLER :頁(yè)滾動(dòng)控件 WC_TABCONTROL :tabControl控件 WC_TREEVIEW :樹視圖控件

通用控件在使用前使用InitCommonControlsEx初始化。使用這些通用控件要include 同時(shí)在連接時(shí)要連接 comctl32.dll

頭部

這些控件和IE有關(guān)系,根據(jù)IE版本不同,控件的外觀和功能有區(qū)別。

(5)創(chuàng)建菜單

CreateMenu:創(chuàng)建一個(gè)菜單

CreatePopupMenu:創(chuàng)建一個(gè)子菜單 AppendMenu:向菜單增加項(xiàng)目 SetMenu:將菜單聯(lián)系到窗口

第六課 進(jìn)程及線程(2學(xué)時(shí))

? 進(jìn)程:是一個(gè)正在運(yùn)行的程序的實(shí)例。由兩個(gè)部分組成

1、一個(gè)是操作系統(tǒng)用來(lái)管理進(jìn)行的內(nèi)核對(duì)象。內(nèi)核對(duì)象是系統(tǒng)用來(lái)存放關(guān)于進(jìn)程信息的地方。

2、地址空間,每個(gè)進(jìn)行都有自己的地址空間

進(jìn)程本身不執(zhí)行代碼,進(jìn)程要至少擁有一個(gè)線程,由線程來(lái)執(zhí)行代碼。每個(gè)線程都擁有自己的CPU寄存器和堆棧。當(dāng)創(chuàng)建一個(gè)進(jìn)程時(shí)系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)主線程。

CreateProcess創(chuàng)建進(jìn)程

內(nèi)部執(zhí)行細(xì)節(jié):1 創(chuàng)建一個(gè)小的結(jié)構(gòu)存放進(jìn)程信息分配地址空間

創(chuàng)建一個(gè)小的結(jié)構(gòu)存放線程信息

執(zhí)行C/C++啟動(dòng)代碼,最終會(huì)調(diào)用WinMain或main。結(jié)束一個(gè)進(jìn)程 TerminateProcess

TerminateProcess 1 使用ToolHelp遍歷系統(tǒng)進(jìn)程

列舉系統(tǒng)全部的進(jìn)程

需要

#include #include using namespace std;

? 線程

線程由兩個(gè)部分組成 內(nèi)核對(duì)象 線程堆棧,用于維護(hù)執(zhí)行代碼時(shí)所有的函數(shù)參數(shù)和局部變量 進(jìn)程是活波的,進(jìn)程不執(zhí)行任何東西,它是線程的容器。線程在進(jìn)程的地址空間中執(zhí)行代碼。如果一個(gè)進(jìn)程擁有多個(gè)線程則這些線程共享進(jìn)程地址空間內(nèi)的代碼和數(shù)據(jù)。進(jìn)程的地址空間要比線程占用更多的系統(tǒng)資源,因此要更多的使用線程。每個(gè)線程必須有個(gè)入口點(diǎn)函數(shù),主線程是main,WinMain。如果要?jiǎng)?chuàng)建一個(gè)線程,則這個(gè)線程的函數(shù)原型是這樣的。DWORD WINAPI ThreadProc(PVOID pvParm){

return value;} 因?yàn)榫€程會(huì)共享全局變量,因此多線程應(yīng)該少使用全局變量 1 線程創(chuàng)建

線程的創(chuàng)建不能直接使用CreateThread API函數(shù)。而要使用C編譯環(huán)境自帶的創(chuàng)建進(jìn)程函數(shù)。

#include

unsigned uThreadid=0;uintptr_t hThread=

_beginthreadex(NULL, 0,ThreadProc,NULL,CREATE_SUSPENDED,&uThreadid);第3個(gè)參數(shù)是線程函數(shù)地址,第4個(gè)參數(shù)是傳遞到線程的LPVOID,第5個(gè)參數(shù)為0線程馬上運(yùn)行、CREATE_SUSPENDED需要激活才能運(yùn)行。最后一個(gè)保存線程的ID 進(jìn)程和線程ID是一個(gè)標(biāo)識(shí)。不重復(fù)。進(jìn)程和線程對(duì)象是系統(tǒng)對(duì)象,關(guān)閉這些對(duì)象對(duì)進(jìn)程和線程的運(yùn)行沒有影響。

第7課 線程的調(diào)度和同步(6學(xué)時(shí))線程暫停:

創(chuàng)建時(shí)使用CREATE_SUSPENDED創(chuàng)建一個(gè)暫停的線程

使用SuspendThread暫停線程

長(zhǎng)時(shí)間不使用窗體 恢復(fù)線程:

ResumeThread

ResumeThread和SuspendThread使用次數(shù)要對(duì)應(yīng)。

休眠線程 Sleep(毫秒)線程的同步是比較容易出錯(cuò)的地方,要多多實(shí)踐和理解。參見線程沖突的例子。

每個(gè)線程對(duì)變量g累加10000次,創(chuàng)建6個(gè)線程,這是其中一次的運(yùn)行結(jié)果??梢钥吹浇Y(jié)果不是60000.對(duì)線程沖突問題的解釋

一條C的g++對(duì)應(yīng)的匯編指令為3條 mov eax,[g] inc eax mov [g],eax

如果我們創(chuàng)建兩個(gè)線程,這兩個(gè)線程將共享上面的代碼。如果只有一個(gè)CPU的話,那同一時(shí)刻只能志執(zhí)行一條匯編指令。但Windows的調(diào)度機(jī)制可以保證代碼按順序執(zhí)行,但不能保證不被打斷。舉例 g=0 mov eax,[g] //1 eax=0 inc eax

//1 eax=1 mov [g],eax //1 g=1 eax=1 mov eax,[g] //2 eax=1 inc eax

//2 eax=2 mov [g],eax //2 g=2 eax=2 1和2兩個(gè)線程分別執(zhí)行上面的3行代碼,則g被加了兩次,得到2。但實(shí)際上這是多線程的特例。真實(shí)的情況是CPU下條要執(zhí)行那個(gè)線程的代碼是隨機(jī)的。如下

g=0 mov eax,[g] //1 eax=0 inc eax

//1 eax=1 mov eax,[g] //2 eax=0 inc eax

//2 eax=1 mov [g],eax //2 g=1 eax=1 mov [g],eax //1 g=1 eax=1

線程1在增加后沒有及時(shí)賦值給g,然后線程2執(zhí)行。最后g為1。這就是線程沒有同步導(dǎo)致的問題,也是我們程序中出現(xiàn)的問題。解決方法(1)原子操作函數(shù)

使用InterlockedExchangeAdd,加減

InterlockedExchange 賦值

InterlockedCompareExchange 比較賦值

使用這些函數(shù)加減變量,保證只有執(zhí)行完后其他進(jìn)程才能進(jìn)入。

結(jié)果是60000了,但是按理應(yīng)該輸出六次“線程運(yùn)行了結(jié)束了”。但只顯示兩次,其實(shí)每次的結(jié)果多不會(huì)一樣。這也是并發(fā)帶來(lái)的問題。

解決方法(2)關(guān)鍵代碼段

在使用關(guān)鍵段之前使用該函數(shù)

輸出了6次,但每次對(duì)應(yīng)的g值不一定以10000遞增。如果把進(jìn)入關(guān)鍵段的位置提前到最前面可以得到常規(guī)的理解

這時(shí)這6個(gè)進(jìn)程某種意義上沒有并發(fā)執(zhí)行。

局限:關(guān)鍵代碼段只能在一個(gè)進(jìn)程內(nèi)使用,沒有等待時(shí)長(zhǎng)的限制容易死鎖。解決方法(3)內(nèi)核對(duì)象 具備通知狀態(tài)的內(nèi)核對(duì)象 進(jìn)程 線程 作業(yè)

文件修改通知 事件

可等待定時(shí)器 文件 信標(biāo)

控制臺(tái)輸入 互斥對(duì)象 舉個(gè)例子

取消注釋后,一次顯示一個(gè)。體現(xiàn)了該函數(shù)對(duì)線程的控制。

(1)事件控制

盡管WaitForSingleObject可以等待很多對(duì)象的反應(yīng),但其主要還是用來(lái)處理事件等對(duì)象。事件是一種內(nèi)核對(duì)象,有兩個(gè)狀態(tài),一個(gè)用于表示該事件是自動(dòng)重置事件還是人工重置事件。人工重置事件等待該事件的線程都會(huì)得到通知,自動(dòng)重置事件只有一個(gè)線程會(huì)得到通知。另一個(gè)是事件的通知狀態(tài)。一是未通知狀態(tài)線程等待,一個(gè)是已通知狀態(tài),線程運(yùn)行。CreateEvent(NULL,自動(dòng)(false)還是手工(true),通知(true)未通知(false)。HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPTSTR lpName);最后一個(gè)是為事件起個(gè)名字,同名事件不能建立兩次。保證同名事件只能建立一次,可以為空。SetEvent:設(shè)為已通知狀態(tài) ResetEvent:設(shè)為未通知狀態(tài)

OpenEvent:打開一個(gè)已經(jīng)存在的時(shí)間,返回Handle

創(chuàng)建自動(dòng)通知,立即通知事件

對(duì)自動(dòng)通知事件SetEvent有意義,對(duì)手工通知事件無(wú)意義。手工通知同時(shí)顯示6個(gè)窗口,自動(dòng)通知一次顯示1個(gè)(2)信標(biāo)內(nèi)核對(duì)象

使用信標(biāo)可以確定讓幾個(gè)線程同時(shí)運(yùn)行

CreateSemaphore(NULL,初始數(shù),最大數(shù),名稱)OpenSemaphore

最多同時(shí)有3個(gè)線程運(yùn)行。(3)互斥對(duì)象

互斥對(duì)象和關(guān)鍵代碼段的作用相同,效率比關(guān)鍵代碼段低。但運(yùn)行不同進(jìn)程間使用互斥對(duì)象,同時(shí)可以設(shè)置最大的等待時(shí)長(zhǎng)?;コ鈱?duì)象和其他內(nèi)核對(duì)象的區(qū)別,互斥對(duì)象可以記錄調(diào)用的線程ID,一旦線程得到該對(duì)象同線程的其他地方的等待將不會(huì)等待。CreateMutex(NULL,初始等待,名稱)OpenMutex(0,NULL,名稱)ReleaseMutex(HANDLE),只能是否本線程得到的對(duì)象

(4)

第三篇:編程入門基礎(chǔ)知識(shí)點(diǎn)總結(jié)

一、常量

? 數(shù)字常量

i.普通數(shù)字:1,35,2.7 ii.指數(shù)形式:2.45e-2等價(jià)于2.45*10-2 注意e大小寫皆可,e前面的數(shù)字不能省,就算是1也不能省,后面的數(shù)字一定要是整數(shù)

iii.長(zhǎng)整型,單精度浮點(diǎn)型:3235L,32.5F 分別表示3235是長(zhǎng)整型數(shù)據(jù),32.5是單精度浮點(diǎn)型左,若不寫上L,F(xiàn)則表示3235是整型,32.5是雙精度浮點(diǎn)型,L,F(xiàn)大小寫皆可

? 字符常量

i.普通字符常量:用單引號(hào)把一個(gè)字符括起來(lái),如?A?,?@?

ii.轉(zhuǎn)義字符常量:一對(duì)單引號(hào)括起來(lái)并以“”開頭的字符序列,如?n?(回車)、?123?(8進(jìn)制123對(duì)應(yīng)的字符), ?x23?(16進(jìn)制23對(duì)應(yīng)的字符)? 字符串常量

用一對(duì)雙引號(hào)把一個(gè)字符序列括起來(lái),如“ABCef”,系統(tǒng)存放字符串常量,每個(gè)字符分配一個(gè)字節(jié),各字符所占字節(jié)緊鄰,并且字符串末尾會(huì)給再開一個(gè)字節(jié)里面放一個(gè)’

主站蜘蛛池模板: 青青青在线香蕉国产精品| 日日摸夜夜添夜夜添高潮喷水| 亚洲精品鲁一鲁一区二区三区| 国产精品亚洲五月天高清| 一本加勒比波多野结衣| 久久不见久久见www免费| 少妇人妻偷人精品免费视频| 欧美精品中文字幕亚洲专区| 国产av无码专区影视| 婷婷色综合视频在线观看| 国产成人综合亚洲精品| 精品综合久久久久久97超人| 亚洲午夜成人精品无码app| 精品国品一二三产品区别在线观看| 久久影院九九被窝爽爽| 性动态图av无码专区| 日韩精品人妻系列无码专区免费| 国产精品午夜无码体验区| 亚洲日韩欧美一区二区三区| 人妻无码系列一区二区三区| 亚洲精品喷潮一区二区三区| 国产免费丝袜调教视频| 国产农村一国产农村无码毛片| 真人性生交免费视频| 99热这里只就有精品22| 88久久精品无码一区二区毛片| 亚洲中文字幕无码av| 精品无码一区二区三区在线| 久久av无码精品人妻系列果冻| 天堂va欧美ⅴa亚洲va免费| 中文成人无码精品久久久不卡| 日日噜噜夜夜狠狠va视频| 西西人体大胆瓣开下部自慰| 国产成人无码手机在线观看| 在线а√天堂中文官网| 在线看片免费人成视频在线影院| 国产精品夜色一区二区三区| 亚洲日韩亚洲另类| 精品国产乱码久久久久久影片| 中国极品少妇videossexhd| 精品国产av色一区二区深夜久久|