欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

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

      時(shí)間:2019-05-15 13:19:11下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《Windows編程知識(shí)點(diǎn)總結(jié)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(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)用程序沒(méi)有處理消息,唯一的解釋就是模態(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è)置大寫(xiě),lowerCase設(shè)置小寫(xiě),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開(kāi)發(fā)基于文檔的應(yīng)用程序的基本框架,最主要的思想是數(shù)據(jù)的管理與顯示分離。

      22視圖類CView23、使用AppWizard創(chuàng)建SDI和MDI的過(guò)程相似,主要區(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ù)的管理與顯示分離,在開(kāi)發(fā)文檔/視圖體系開(kāi)發(fā)應(yīng)用過(guò)程時(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à)操作一般會(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、畫(huà)刷其實(shí)是一個(gè)像素大小為8*8的位圖,用多個(gè)相同的位圖對(duì)封圖形的內(nèi)部進(jìn)行填充

      32、位圖

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

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

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

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

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

      36、keybd_event只是用于產(chǎn)生鍵盤(pán)事件,至于由誰(shuí)來(lái)處理他并不關(guān)心。系統(tǒng)捕捉到鍵盤(pán)事件后,會(huì)轉(zhuǎn)化為鍵盤(pán)消息的形式派發(fā)給當(dāng)前系統(tǒng)中擁有鍵盤(pán)輸入焦點(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)聽(tīng)遠(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)程的地址空間,因此線程只能訪問(wèn)本進(jìn)程的地址空間,而其他進(jìn)程對(duì)其是不可見(jiàn)的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):

      空閑:地址空間沒(méi)有被占用,不能使用

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

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

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

      內(nèi)存映射文件可以在進(jìn)程中保留一個(gè)地址空間區(qū)域,并把磁盤(pán)文件提交給該區(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ù)寫(xiě)入共享內(nèi)存時(shí),其他進(jìn)程可以立即獲取數(shù)據(jù)變更情況,顯然這種共享內(nèi)存的方式是完全可以滿足在進(jìn)程間進(jìn)行大數(shù)據(jù)快速傳輸任務(wù)要求的。

      54、與內(nèi)存映射磁盤(pán)文件一樣,共享內(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)程向管道寫(xiě)入信息,另外一個(gè)進(jìn)程從管道讀取信息

      58、匿名管道

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

      59、命名管道的特征:

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

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

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

      命名管道可以用于網(wǎng)絡(luò)間兩個(gè)進(jìn)程的通信,而其實(shí)現(xiàn)過(guò)程與本地進(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í)也是開(kāi)銷比較小的進(jìn)程間通信方式。

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

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

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

      文本剪貼板

      位圖剪貼板

      自定義格式

      延遲提交

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

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

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

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

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

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

      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ì)資源的訪問(wèn)情況。

      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ì)資源的訪問(wèn)權(quán)。

      75、如果線程需要訪問(wèn)該資源就要先獲取互斥對(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)編譯過(guò)程。編譯源碼,為每個(gè)C/C++源文件生成一個(gè).obj模塊,由編譯器完成。

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

      79、DLL隱式鏈接,是指在鏈接過(guò)程中,把應(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)用程序輸入表中沒(méi)有記錄。

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

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

      82、線程本地存儲(chǔ)器(TLS)的主要作用是可以避免多個(gè)線程同時(shí)訪問(wèn)同一全局或者靜態(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的開(kāi)發(fā)也是越來(lái)越少了。因此,市面上很少有泛泛的簡(jiǎn)單入門(mén)級(jí)的Windows程序設(shè)計(jì)了。一個(gè)是系統(tǒng)級(jí)的Windows編程介紹,如Windows核心編程。一個(gè)是方向級(jí)的Windows編程介紹如Windows圖形編程,Windows網(wǎng)絡(luò)編程等等。我們這次課的主要參考用書(shū)是Windows核心編程,同時(shí)也參考了一些其他內(nèi)容。鑒于教材的價(jià)格較貴,同時(shí)也需要考慮我們自身的學(xué)習(xí)內(nèi)容不一定很多以及學(xué)時(shí)的原因,就沒(méi)有定教材??次业慕贪赴?。

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

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

      我校機(jī)器上安裝了VC++ 6.0。相信這是大家一直以來(lái)學(xué)習(xí)C,C++使用的開(kāi)發(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)。本次授課的開(kā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)境在我們的共享資源里有,大家可以下載安裝。安裝過(guò)程非常簡(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 訪問(wèn)Helloworld網(wǎng)站,因?yàn)榘袶elloworld顯示在屏幕上并不容易,我們可以一點(diǎn)一點(diǎn)來(lái),先讓Helloworld以文字形式出現(xiàn)在其他地方,這里我們通過(guò)訪問(wèn)網(wǎng)站004km.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í))

      在我們寫(xiě)控制臺(tái)應(yīng)用的時(shí)候,不能自由的控制輸出顯示的位置。因此,沒(méi)有學(xué)習(xí)過(guò)這方面的內(nèi)容,現(xiàn)在我們創(chuàng)建了窗口,并且在窗口上顯示了Hello World。這個(gè)過(guò)程涉及到很多涉及位置和大小的因素,如窗口的大小,顯示的位置,文字顯示的位置。說(shuō)到位置,就涉及定位,說(shuō)到定位就要說(shuō)坐標(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ì)象,其子空間。下面我們通過(guò)一個(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)系,大寫(xiě)為設(shè)備坐標(biāo),小寫(xiě)為頁(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)

      通過(guò)對(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是把畫(huà)筆移動(dòng)到指定位置(頁(yè)面坐標(biāo)),LineTo是從畫(huà)筆所在位置到目標(biāo)位置畫(huà)一條線。

      在這個(gè)例子中,每次劃線前通過(guò)設(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)的變換。小寫(xiě)到大寫(xiě)。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度

      我們下面的例子通過(guò)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)畫(huà)筆

      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);

      提示:

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

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

      (1)畫(huà)點(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)開(kāi)機(jī)后到現(xiàn)在的滴答數(shù),特點(diǎn)就是每次返回的結(jié)果不重復(fù)。

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

      rand得到函數(shù)

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

      (2)畫(huà)線

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

      步驟

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

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

      3、用畫(huà)筆繪制

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

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

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

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

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

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

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

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

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

      (3)畫(huà)面

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

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

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

      3、用畫(huà)刷填充

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

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

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

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

      使用FillRect不繪制邊框,因?yàn)閰?shù)中有畫(huà)筆,也不用SelectObject了。Ellipse:橢圓,圓。畫(huà)邊框,填充 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)用中沒(méi)有的。本章我們介紹如何在窗口中加入按鈕等常規(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)系疊加。具體要參見(jiàn)MSDN(2)操控

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

      我們操作控件會(huì)觸發(fā)控件的事件得到一些反饋,下面介紹如何得到這些反饋??傮w上,我們把這些反饋過(guò)程叫通知。通知的過(guò)程是將反饋發(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。該事件通過(guò)WM_COMMAND通知。

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

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

      我們上面介紹的是基本的控件,除了這些基本控件外還有一些通用控件。這些控件的使用和處理和基本的控件差不多,但功能更強(qiáng)大。ANIMATE_CLASS : 動(dòng)畫(huà)控件,播放AVI動(dòng)畫(huà) 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 :樹(shù)視圖控件

      通用控件在使用前使用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)行沒(méi)有影響。

      第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í)踐和理解。參見(jiàn)線程沖突的例子。

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

      一條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在增加后沒(méi)有及時(shí)賦值給g,然后線程2執(zhí)行。最后g為1。這就是線程沒(méi)有同步導(dǎo)致的問(wèn)題,也是我們程序中出現(xiàn)的問(wè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)的問(wèn)題。

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

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

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

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

      局限:關(guān)鍵代碼段只能在一個(gè)進(jìn)程內(nèi)使用,沒(mé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:打開(kāi)一個(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)

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

      一、常量

      ? 數(shù)字常量

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

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

      ? 字符常量

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

      ii.轉(zhuǎn)義字符常量:一對(duì)單引號(hào)括起來(lái)并以“”開(kā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ì)給再開(kāi)一個(gè)字節(jié)里面放一個(gè)’