![C++_MFC 基礎(chǔ)教程_(初學(xué)者)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/158c5a0e-28b1-4738-9f5d-ec317c3631ff/158c5a0e-28b1-4738-9f5d-ec317c3631ff1.gif)
![C++_MFC 基礎(chǔ)教程_(初學(xué)者)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/158c5a0e-28b1-4738-9f5d-ec317c3631ff/158c5a0e-28b1-4738-9f5d-ec317c3631ff2.gif)
![C++_MFC 基礎(chǔ)教程_(初學(xué)者)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/158c5a0e-28b1-4738-9f5d-ec317c3631ff/158c5a0e-28b1-4738-9f5d-ec317c3631ff3.gif)
![C++_MFC 基礎(chǔ)教程_(初學(xué)者)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/158c5a0e-28b1-4738-9f5d-ec317c3631ff/158c5a0e-28b1-4738-9f5d-ec317c3631ff4.gif)
![C++_MFC 基礎(chǔ)教程_(初學(xué)者)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/158c5a0e-28b1-4738-9f5d-ec317c3631ff/158c5a0e-28b1-4738-9f5d-ec317c3631ff5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 好好學(xué)習(xí),天天向上! ppt簡介共14章、442頁,涵蓋了vc的基礎(chǔ)介紹,以及mfc程序的創(chuàng)建,控件的使用、多線程、多媒體編程、網(wǎng)絡(luò)編程、動態(tài)鏈接庫的使用等等,是那些喜歡MFC但是不知道從何學(xué)起的MFC愛好者的最佳的基礎(chǔ)教材!第1章 Visual C+集成開發(fā)環(huán)境Visual C+是一個功能強大的可視化應(yīng)用程序開發(fā)工具。其憑借強大功能,受大了廣大程序員的歡迎。當今流行的Visual C+的開發(fā)工具是6.0版本。下面來介紹Visual C+ 6.0的一些基本情況。1.1 Visual C+ 6.0概述Visual C+是一種C/C+語言的集成開發(fā)環(huán)境(IDE)。當最初還處于DOS時代的Borl
2、and公司推出了Turbo Pascal和Turbo C,讓程序員感受到了把編譯器和編輯器集成在一起使用時的方便。Microsoft公司也看到了這一點,于是,兩個公司開始合作,推出了Quick C和Microsoft C/C+等多個DOS版本的C/C+集成開發(fā)環(huán)境。隨著Windows的不斷成熟,于是Microsoft開始開發(fā)Windows下的Visual C+。經(jīng)過多次版本的修訂與更新,現(xiàn)在大多數(shù)程序員使用的是Visual C+ 6.0版本。Visual C+是一個可視化的C+的集成開發(fā)環(huán)境。在使用Visual C+時,開發(fā)人員可以通過鼠標拖動方便地設(shè)計程序的界面,相應(yīng)的代碼系統(tǒng)會自動生成。M
3、FC(Microsoft Fundermental Classes)是微軟提供的Visual C+可以調(diào)用的類庫,其中封裝了開發(fā)人員常用的類。使用MFC可以大大提高編程人員的工作效率。1.2 Visual C+6.0界面介紹安裝好Visual C+開發(fā)環(huán)境后,桌面上并沒有其快捷圖標,需讀者自己修改。選擇“開始”菜單,從所有程序中,找到Microsoft Visual Studio 6.0級聯(lián)菜單下的Microsoft Visual C+菜單項。選擇該菜單項,并將其拖動到桌面上,則在桌面上創(chuàng)建了Microsoft Visual Studio的快捷圖標。雙擊快捷圖標,即可啟動Visual C+6.
4、0集成開發(fā)環(huán)境。每次運行Visual C+6.0時,會彈出一個【Tip of the day】對話框,如下圖所示。1.2 Visual C+6.0界面介紹技巧:【Tip of the day】對話框中介紹了很多關(guān)于開發(fā)環(huán)境的使用方法以及編程方面的小技巧。如果想在下次啟動Visual C+ 6.0時不再顯示該提示對話框,可以選擇下一次啟動時不再顯示它。1.2 Visual C+6.0界面介紹為了便于說明,首先創(chuàng)建一個IDE的MFC項目(具體創(chuàng)建步驟,后面會詳細介紹),如下圖所示。1.2 Visual C+6.0界面介紹從上圖中可以看出,Visual C+的界面被分成了7部分。上面依次標題欄、菜單
5、欄和工具欄。中間左側(cè)部分是工作區(qū)窗口,右側(cè)部分是編輯區(qū)。最下方是輸出窗口和狀態(tài)欄。1.2.1 工作區(qū)窗口和輸出窗口工作區(qū)窗口和輸出窗口是在一個程序編譯時使用最多的??渴酱翱?。工作區(qū)窗口中顯示了當前程序中的所有類、資源和文件信息。工作區(qū)窗口分為3個部分:Class View(類視圖)、Resource View(資源視圖)和File View(文件視圖)。Class View:顯示當前工作區(qū)中所有工程定義的C+類。雙擊某個類名,Visual C+會自動打開這個類的文件,并將編輯區(qū)定位到該類的定義處。雙擊類中的成員函數(shù)和變量,編輯區(qū)則定位到該成員函數(shù)或變量的定義處。1.2.1 工作區(qū)窗口和輸出窗口
6、Resource View:顯示當前工作區(qū)中所有的資源。這些資源包括快捷鍵、對話框、圖標、菜單、字符條編輯器、工具欄和版本信息。雙擊其中的ID號,會顯示相應(yīng)的資源信息。File View:顯示屬于當前工程的所有文件,包括C/C+源文件、頭文件、資源文件等。輸出窗口與工作區(qū)一樣,分為多個選擇卡。其中最常用的選項卡被放在了最外面,分別為Build、Debug、Find in Files 1和Find in Files 2。1.2.1 工作區(qū)窗口和輸出窗口Build:Build顯示工程在創(chuàng)建中,經(jīng)過的每一個步驟及相應(yīng)信息。如果出現(xiàn)編譯鏈接錯誤,那么出現(xiàn)錯誤的文件、原因、行號等內(nèi)容會顯示在Build中
7、。雙擊該錯誤信息行,編輯區(qū)則定位在該錯誤出現(xiàn)的行。Debug:工程通過編譯后,運行調(diào)試版本時,Debug選項卡中會顯示具體的調(diào)試信息。1.2.1 工作區(qū)窗口和輸出窗口Find in Files 1和Find in Files 2:兩個選項卡的作用相同,用于顯示從多個文件中查找字符串的結(jié)果。當用戶想要查看某個函數(shù)或變量出現(xiàn)在哪些文件中,單擊【Edit】|【Find in Files】命令,彈出【Find in Files】對話框,如下圖所示。在【Find in Files】對話框中的【Find what】后的編輯框中,輸入想要查找的內(nèi)容,單擊【Find】按鈕即可。查找到的內(nèi)容會輸出到Find i
8、n Files選項卡中。1.2.2 菜單欄和工具欄菜單欄位于集成開發(fā)環(huán)境的頂部。菜單欄由9個菜單項組成:File(文件)、Edit(編輯)、View(視圖)、Insert(插入)、Project(工程)、Build(編譯)、Tools(工具)、Windows(窗口)、Help(幫助)。每一個菜單項都有一個下拉式菜單,其中的菜單項用于完成特定的功能。工具欄位于菜單欄的下面。工具欄可以稱作是美化的菜單欄,其由許多按鈕構(gòu)成。其中的按鈕用于完成特定的功能。工具欄可以任意拖動,也可以成為一個浮動窗口。1.2.3 編輯區(qū)在Visual C+中,編寫應(yīng)用程序代碼的位置就是編輯區(qū)。該編輯區(qū)的功能十分強大,智能
9、化程度也非常高。在編輯區(qū)內(nèi),除了能編寫C/C+語言外,還能編寫SQL、HTML和VBScript等其他編程語言。如下圖所示。1.2.4 聯(lián)機幫助Visual C+6.0不像其他集成開發(fā)環(huán)境一樣把幫助系統(tǒng)集成在開發(fā)環(huán)境內(nèi)部,而是提供了一個專門為Visual C+設(shè)計的MSDN類庫。MSDN雖然是一個獨立的幫助系統(tǒng),但卻能很好地和Visual C+6.0集成在一起。MSDN的使用方式有以下幾種:單擊【Help】|【Contents】命令;單擊【Help】|【Search】命令;單擊【Help】|【Index】命令;按下【F2】鍵。通過上述幾種命令方式,即可運行MSDN。1.2.4 Visual C
10、+中的文件擴展名打開程序Hello World所在的文件夾,看到該文件夾自動生成了許多擴展名不同的文件,如下圖所示。1.2.6 Visual C+中的文件擴展名了解這些不同的擴展名文件,對于理解Visual C+6.0如何組織和管理項目文件是很有必要的。有關(guān)這些文件擴展名及其說明,如下表所示。第2章 MFC與應(yīng)用程序框架在Visual C+集成開發(fā)環(huán)境下,使用微軟基礎(chǔ)類庫MFC,可以開發(fā)出功能強大的Windows應(yīng)用程序。另外,通過MFC AppWizard自動生成的MFC應(yīng)用程序框架,還可以很方便地開發(fā)自己想要實現(xiàn)的功能。本章將先介紹有關(guān)MFC的基礎(chǔ)知識,然后對MFC應(yīng)用程序框架作具體介紹。
11、2.1 微軟基礎(chǔ)類庫MFCMFC是一種重要的編程方法,它是微軟公司的特定的應(yīng)用程序包裝接口。本節(jié)將講解MFC概述及其類庫結(jié)構(gòu)。2.1.1 MFC概述MFC的英文全稱是Microsoft Foundation Classes,即微軟的基礎(chǔ)類庫。MFC的本質(zhì)就是一個包含了許多微軟公司已經(jīng)定義好的對象的類庫。雖然開發(fā)人員要編寫的程序在功能上各有不同,但是從結(jié)構(gòu)上講,都可以化分為對用戶界面的設(shè)計、對文件的操作、對數(shù)據(jù)庫的訪問及對多媒體的使用等一些最主要的方面。這一點正是微軟提出MFC類庫最重要的原因。在MFC類庫中,大約有200個類。在進行程序設(shè)計時,只需簡單地調(diào)用已有的類及類中的方法即可。另外,還可
12、以利用“繼承”方法從已有類中派生出自己想要的類。這時,派生出來的類不但擁有父類中的方法和屬性,還可以根據(jù)自己的需求,自定義一些特殊的屬性和方法,使得派生類功能更加強大。MFC有較好的移植性,可應(yīng)用于眾多平臺。2.1.2 MFC類庫結(jié)構(gòu)MFC中類可劃分為基類、應(yīng)用程序結(jié)構(gòu)類、窗口類、OLE類、數(shù)據(jù)庫類等10大類,而且在其中的一些大類的基礎(chǔ)上又派生出許多子類。MFC的類庫結(jié)構(gòu)的層次圖如下圖所示。2.1.2 MFC類庫結(jié)構(gòu)從上圖中可以看出,CObject是一個原始基類。絕大多數(shù)MFC類的最終基類都是CObject。原始基類下面,主要包括以下幾種類:MFC應(yīng)用程序結(jié)構(gòu)類,窗口、對話框和控件類,輸出(設(shè)
13、備文本)和繪圖類,簡單數(shù)據(jù)類型類,數(shù)組、列表和映射類,文件和數(shù)據(jù)庫類,Internet和網(wǎng)絡(luò)類,OLE類以及高度和異常類。MFC的應(yīng)用程序結(jié)構(gòu)類分為CWinApp和CWinThread。使用MFC創(chuàng)建的每一個應(yīng)用程序都包含一個由類CWinApp派生而來的應(yīng)用程序?qū)ο?。該對象是一個全局對象。應(yīng)用程序?qū)ο笾饕糜谔幚響?yīng)用程序的初始化,同時也處理應(yīng)用程序事件的消息循環(huán)。CCmdTarget和CCmdUI為MFC中常用的有關(guān)發(fā)送命令的類。CDocument為MFC中常用的應(yīng)用程序文檔的基類。CDocTemplate為文檔模版類,通常是應(yīng)用程序的單文檔或多文檔的基類。CView類是常用的視圖類。2.2
14、MFC應(yīng)用程序框架分析在前面介紹過如何創(chuàng)建一個基于單文檔的應(yīng)用程序。對于如何選擇性地創(chuàng)建基于多文檔或是基于對話框的應(yīng)用程序,將會在后續(xù)章節(jié)詳細介紹。本節(jié)主要對MFC應(yīng)用程序框進行簡單的概括,使讀者了解MFC應(yīng)用程序框架的結(jié)構(gòu)與工作機制。2.2.1 入口函數(shù)入口函數(shù)就是指一個程序的入口點。WinMain函數(shù)是Windows程序的入口函數(shù)。為了便于講解,首先要創(chuàng)建一個MFC應(yīng)用程序,程序名命名為sample0201。具體創(chuàng)建步驟不再詳細介紹。從創(chuàng)建好的sample0201程序中,并不能找到WinMain函數(shù)。這是因為典型Windows程序的大部分初始化工作都是標準化的,因此把WinMain函數(shù)隱藏
15、在應(yīng)用程序的框架中。當一個程序編譯時,會自動將該函數(shù)鏈接到程序中。在計算機中找到Visual C+的安裝目錄,筆者安裝在F盤,則按照下面這個路徑依次打開文件夾,“F:Program FilesMicrosoft Visual StudioVC98MFCSRC”。打開后,會發(fā)現(xiàn)一個源文件“WinMain.cpp”。該文件中則定義了MFC應(yīng)用程序的入口函數(shù)AfxWinMain。文件的源代碼如下:2.2.1 入口函數(shù)2.2.1 入口函數(shù)當一個應(yīng)用程序啟動時,會自動調(diào)用應(yīng)用程序框架內(nèi)部的AfxWinMain函數(shù)。根據(jù)其前綴Afx就知道WinMain是一個全局的MFC函數(shù)。從上述代碼中可以看出,WinM
16、ain函數(shù)會查找該應(yīng)用程序的一個全局構(gòu)造對象。該對象是由CWinApp的派生類創(chuàng)建,因此有程序啟動時,它就被創(chuàng)建好了。然后WinMain對該應(yīng)用程序進行初始化,在此過程調(diào)用的是該程序全局構(gòu)造對象的InitApplication()和InitInstance()函數(shù)。完成初始化后,WinMain調(diào)用Run()函數(shù),運行應(yīng)用程序的消息循環(huán)。最后結(jié)束應(yīng)用程序時,WinMain調(diào)用AfxWinTerm()函數(shù),做一些清理工作。2.2.2 InitInstance()函數(shù)InitInstance()函數(shù)的作用是初始化程序。每次啟動一個應(yīng)用程序時,Winmain函數(shù)會自動調(diào)用InitInstance()函
17、數(shù)。打開創(chuàng)建的程序sample0201,在該程序的CSample0201App類中,可以看到該程序?qū)nitInstance()函數(shù)進行了重載。該重載代碼如下:2.2.2 InitInstance()函數(shù)從上述代碼中可以看出,在ShowWindow和UpdateWindos之前,程序要做兩個動作,一個是注冊窗口類,另一個是構(gòu)建窗口類。InitInstance()函數(shù)規(guī)定了生成的應(yīng)用程序是基于單文檔的、基于多文檔的或是基于對話框的。因此在CWinApp中必須重載InitInstance()函數(shù)。2.2.3 應(yīng)用類Run()函數(shù)與查找WinMain函數(shù)類似,在Visual C+的安裝目錄下,按照下
18、面這個路徑依次打開文件夾,“F:Program FilesMicrosoft Visual StudioVC98MFCSRC”。打開后,會發(fā)現(xiàn)一個源文件“THRDCORE.CPP”。該文件中定義了應(yīng)用類Run()函數(shù),源代碼如下:2.2.3 應(yīng)用類Run()函數(shù)從上述代碼中可以看出,如果消息隊列沒有消息,則調(diào)用OnIdle( )函數(shù),并遞增iIdleCount計數(shù)標志,該計數(shù)標志表示在兩次消息處理過程只共調(diào)用了多少次OnIdle()函數(shù)。bIdle是消息隊列空閑的標志,當消息隊列有消息時,則調(diào)用PumpMessage()函數(shù),進行消息翻譯和消息派發(fā)。其中PreTranslateMessage(
19、&m_msgCur)對消息進行翻譯,DispatchMessage(&m_msgCur)把消息m_madCur發(fā)送到應(yīng)用程序主框架窗口。注意:在應(yīng)用程序sample0201的CSample0201App的Run函數(shù)繼承了CWinApp的虛函數(shù)Run()。而CWinApp的Run()函數(shù)調(diào)用了CWinThread的Run()函數(shù)。2.2.4 消息映射表當MFC應(yīng)用程序類中的Run()函數(shù)把消息交給主窗口的窗口函數(shù)后,窗口函數(shù)將如何處理這些消息。在Win32程序中,處理窗口消息的窗口函數(shù)WinProc()函數(shù)通過switchcase結(jié)構(gòu)對消息進行判斷并分別進行處理。但在MFC應(yīng)用程
20、序的主窗口類對消息的處理并沒有沿襲Win32程序的做法。MFC應(yīng)用程序中進行消息處理,是為每一個要處理的消息添加一個消息處理函數(shù)。這種定義消息和消息處理函數(shù)的對照表,稱為消息映射表。MFC的消息映射表采用映射宏的方式,將消息和消息處理函數(shù)一一對應(yīng)起來。以應(yīng)用程序的主框架為例,在類的聲明文件MainFrame.h中添加聲明消息映射的宏。2.2.4 消息映射表在類的實現(xiàn)文件MainFrame.cpp中,添加消息映射宏的定義語句。其中,ID_MY_MESSAGE為自定義的菜單項命令I(lǐng)D號,OnMymessage()為響應(yīng)菜單命令的成員函數(shù)。2.2.5 MFC消息分類MFC應(yīng)用程序?qū)ο⒌拿枋鲆话惴譃?/p>
21、3類:窗口消息、命令消息和控件消息。1窗口消息窗口消息一般與創(chuàng)建窗口、繪制窗口、移動窗口和銷毀窗口等操作有關(guān)。另外,當使用鼠標、鍵盤等與操作窗口有關(guān)的動作時,也會產(chǎn)生窗口消息。窗口消息的一般的表示形式是以“WM_”開頭的消息。常見的窗口消息如下所述。WM_CHAR:使用鍵盤時產(chǎn)生的消息。其對應(yīng)的消息處理函數(shù)為OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)。WM_CREATE:創(chuàng)建窗口時產(chǎn)生的消息,用于窗口的初始化。其對應(yīng)的消息處理函數(shù)為OnCreate(LPCREATESTRUCT lpCreateStruct)。WM_PAINT:通知窗口對自身進行
22、繪制。一般在移動窗口、改變窗口大小、繪制圖形時使用。其對應(yīng)的消息處理函數(shù)為OnPaint()。1窗口消息WM_LBUTTONDOWM:使用鼠標左鍵時產(chǎn)生的消息。通知窗口單擊了左鍵。其對應(yīng)的消息處理函數(shù)為OnLButtonDown(UINT nFlags, CPoint point)。WM_MOUSEMOVE:移動鼠標時產(chǎn)生的消息。其對應(yīng)的消息處理函數(shù)為OnMouseMove(UINT nFlags, CPoint point)。WM_CLOSE:關(guān)閉窗口時產(chǎn)生的消息。其對應(yīng)的消息處理函數(shù)為OnClose()。WM_DESTROY:銷毀窗口時產(chǎn)生的消息。其對應(yīng)的消息處理函數(shù)為OnDestroy(
23、)。2命令消息命令消息一般與處理用戶的某個請求或執(zhí)行用戶的某個命令有關(guān)。一般通過選擇菜單項、單擊工具欄按鈕和按加速鍵產(chǎn)生命令消息。在MFC應(yīng)用程序中,凡是從基類CCmdTarget派生出來的子類,都能處理命令消息。另外,文檔類、視圖類和應(yīng)用程序類都能處理命令消息。創(chuàng)建命令消息時,可以使用MFC Class Wizard建立消息映射和消息處理函數(shù)之間的關(guān)系。例如,應(yīng)用程序類發(fā)出文件打開命令,假設(shè)打開文件對應(yīng)的菜單資源ID為ID_FILE_IPEN,則其命令消息如下:3控件消息普通的控件都是子窗口,因為其都繼承自CWnd。它們通過向其父窗口(一般為對話框)發(fā)關(guān)消息,響應(yīng)用戶的動作(如移動鼠標,單擊
24、等)??丶⒁话闶怯砂粹o(BN_)、編輯框(EN_)、下拉列表框(LBN_)和組合框(CBN_)等控件產(chǎn)生的。其消息映射宏是在消息名前加上ON_,例如:第3章 C+語言基礎(chǔ)要使用Visual C+進行Windows應(yīng)用程序的開發(fā),就要掌握面向?qū)ο蟮乃枷牒虲+語言。本章先講述一個簡單的C+程序,然后根據(jù)這個程序,向讀者介紹C+中語言基礎(chǔ)。3.2 C+的基本數(shù)據(jù)類型及數(shù)據(jù)數(shù)據(jù)類型是對數(shù)據(jù)的一種抽象描述。在計算機程序中能操作的數(shù)據(jù)有很多種,不同的數(shù)據(jù)所需要的存儲空間有所不同。將數(shù)據(jù)按照類型進行分類,有助于程序員對于存儲空間的分配。本節(jié)將具體介紹有關(guān)C+中的數(shù)據(jù)及其所屬的數(shù)據(jù)類型。3.2.2 變量變
25、量是一種特殊的標識符,在變量中可以存儲數(shù)據(jù)。變量中存儲的數(shù)據(jù)可以根據(jù)程序的需要而改變,因此稱為變量。1定義變量在C+中,使用一個變量必須先定義該變量。C+中定義變量的語法代碼如下:定義一個變量需要說明兩點,一是變量的類型,二是變量的名稱。其中,變量的類型是C+中的數(shù)據(jù)類型。變量名是用戶為變量起的名稱。3.2.2 變量C+的變量名由字符及數(shù)字等組成。變量名必須滿足以下幾個條件。變量名只能由字母、數(shù)字和下劃線(_)組成。變量名必須以字母或下劃線開頭。變量名不能包含空白字符(換行符、空格和制表符稱為空白字符)。變量名不能與保留字名相同。變量名區(qū)分大小寫。3.2.2 變量2變量賦值如果想要使用一個變量
26、,就要為其進行賦值。如果沒有對定義的變量賦值,Visual C+會為該變量默認一個值。例如,如果是一個int類型的變量且沒有賦值,Visual C+將默認其值為0。C+中為變量賦值的方法有兩種:一種是在定義變量的同時賦值,另一種是在定義變量后賦值。在定義變量的同時賦值,代碼如下:在定義變量后賦值,代碼如下:3.2.3常量常量與變量相反,是一個不隨時間和程序變化而變化的值。C+中,常量的命名規(guī)則和變量的大體相同。不同的是,常量名稱中的字母都為大寫。C+中定義符號常量的語法代碼如下:例如,在計算圓形面積的時候,經(jīng)常用到PI。為了避免重復(fù)地輸入PI的實際取值,而用下面的形式聲明PI的取值。這樣,在程
27、序中編譯時,會將程序中出現(xiàn)的所有字符串PI全部置換成3.14。如果想要修改程序中PI的值,只需在頭文件處修改,全部PI的取值都會發(fā)生變化。3.2.3常量C+中定義靜態(tài)常量的語法代碼如下:在C+中,同聲符號常量一樣,在聲明靜態(tài)常量時,也要對其進行初始化,代碼如下:注意:在符號常量中,PI沒有類型,不占有存儲單元,且容易出錯。而在Const常量中,PI有數(shù)據(jù)類型,并且占有存儲單元,有地址,因此可以使用指針指向它。3.3 C+的運算符及表達式運算符和表達式是一種程序語言的基礎(chǔ)。運算符的作用是操作變量或表達式。C+中的運算符包括賦值運算符、算術(shù)運算符、邏輯運算符、關(guān)系運算符、位運算符、逗號運算符、條件
28、運算符等。本節(jié)將介紹這些運算符及其所組成的表達式。3.3.1 表達式表達式是C+程序中不可缺少的一部分。表達式是由運算符、操作數(shù)(變量、常量或函數(shù)等)和標點符號,按照一定規(guī)則組成的一個有意義的語句。例如:3.3.2 運算符C+中的運算符就是一種符號,該符號可以用于處理數(shù)據(jù)。平時有數(shù)學(xué)計算中所使用的“+”、“-”、“”、“”都屬于運算符。只是這些運算符在C+中的表現(xiàn)形式可能與日常生活中有所不同。下面將對C+中的運算符作具體介紹。1賦值運算符賦值運算符是用于為變量或常量指定數(shù)值的運算體符。其操作符號為“”,示例代碼如下:上述表達式的意義是,把b的值賦值給a。其中,b可以是一個單純的變量,也可以是一
29、個表達式。3.3.2 運算符2算術(shù)運算符算術(shù)運算符是用于進行數(shù)學(xué)運算的運算符。例如,加、減、乘、除等就是算術(shù)運算符。操作完成后,返回一個數(shù)字型的值。算術(shù)運算符包括加法運算符(+)、減法運算符(-)、乘法運算符(*)、除法運算符(/)、模運算符()。上述算術(shù)運算符都是二元運算符,該運算符兩端的數(shù)據(jù)必須是數(shù)字。3.3.2 運算符3邏輯運算符邏輯運算符,即用于處理邏輯值的運算符。邏輯運算符通常用在條件判斷語句或循環(huán)語句中,如if、while語句等。C+中的邏輯運算符包括邏輯與運算符(&)、邏輯或運算符(|)、邏輯非運算符(!)。由邏輯運算符構(gòu)成的表達式,稱為邏輯表達式。邏輯表達式的返回值為邏
30、輯值(true或false),一般情況下,1代表true,0代表false。邏輯與運算符可以進行與操作,其操作方法為:如果邏輯與運算符前的數(shù)為false(或是可以得出false的邏輯表達式),則返回false,否則返回true;當邏輯與運算符前后兩個數(shù)都為true時,才返回true。邏輯或運算符可以進行或操作,其操作方法為:只要邏輯或運算符前后的數(shù)據(jù)中有一個為true(或是可以得出true的邏輯表達式),則返回true;當邏輯或運算符前后兩個數(shù)都為false時,才返回false。邏輯非運算符要求要操作的數(shù)據(jù)必須是邏輯值,或是能夠轉(zhuǎn)換成邏輯值的邏輯表達式。邏輯非運算符可以進行非操作,其操作方法為
31、:如果要操作的數(shù)據(jù)為true,則返回false;如果要操作的數(shù)據(jù)為false,則返回true。3.3.2 運算符4關(guān)系運算符關(guān)系運算符,即用于比較兩個數(shù)據(jù)關(guān)系大小的運算符,并根據(jù)比較的結(jié)果返回一個邏輯值。關(guān)系運算符包括大于運算符()、大于等于運算符(=)、小于運算符()、小于等于運算符(”一起使用。使用cin的語法代碼如下:例如,想要從鍵盤輸入一些數(shù)據(jù),將使用下述代碼:如果想要一次性輸入多個數(shù)據(jù),不是使用逗號作為分隔符,而應(yīng)該用“”分隔,應(yīng)該寫成:3.4.1 C+的輸入輸出2輸出語句C+的輸出語句用cout表示。其中,cout必須和“”一起使用,使用cout的語法代碼如下:例如,想要從鍵盤輸出
32、一些數(shù)據(jù),將使用下述代碼:如果想要一次性的輸出多個數(shù)據(jù),同樣不是使用逗號作為分隔符,而是每項數(shù)據(jù)之間用“Close();/關(guān)閉記錄集m_pConnection-Close();/關(guān)閉連接第13章 多線程編程Windows是一個多任務(wù)的操作系統(tǒng)。多線程運行可以提高系統(tǒng)的運行效率,因此使用比較廣泛。本章將對進程與線程進行簡單介紹。內(nèi)容包括:進程與線程、線程的使用、線程的終止與通信等。通過本章的學(xué)習(xí),讀者可以在程序中調(diào)用其他應(yīng)用程序,可以實現(xiàn)進程間的通信,可以實現(xiàn)線程的同步。下面對多線程技術(shù)進行詳細介紹。 13.1 進程與線程進程(Process)是應(yīng)用程序的執(zhí)行實例。每個進行都可以訪問進程中的所有
33、資源。一個進程是由一個或多個進行、代碼、數(shù)據(jù)和應(yīng)用程序在內(nèi)存中的其他資源組成。當一個應(yīng)用程序啟動,相應(yīng)的一個進程進行也會啟動,這個進行稱為父進程。一個應(yīng)用程序還可以啟動其他進程,被啟動的其他進程稱為子進程。想要查看進程,可以打開Windows的任務(wù)管理器。單擊【進程】標簽,在【進程】選擇卡中可以查看當前系統(tǒng)中的各個進程,如右圖所示。進程是資源的分配單位,每個進程都擁有自己的地址空間和上下文環(huán)境。13.1 進程與線程進程是線程的容器,線程是進程內(nèi)部的一個執(zhí)行單元。一個進程可以有一個或是多個線程,但這些線程僅生存于該進程中。也就是說,線程是在它所屬的進程地址空間里執(zhí)行代碼,并在進程的地址空間對數(shù)據(jù)
34、進行操作。線程用于描述進程中的運行路徑。當一個進程被啟動時,系統(tǒng)就要創(chuàng)建一個主線程。該主線程是應(yīng)用程序需要的唯一線程,但進程也可以創(chuàng)建其他線程來完善進程的其他操作。13.2 線程的分類在MFC中,線程分為兩類:用戶界面線程(User-Interface Thread)和工作者線程(Worker Thread)。用戶界面線程:該線程通常用來處理用戶的輸入并響應(yīng)用戶生成的事件和消息。用戶界面線程是從CWinThread類派生而來的。在MFC中,CWinApp對象就是一個用戶界面線程。通常情況下,用戶界面線程都是主線程。當應(yīng)用程序啟動時,用戶界面線程隨之啟動。當應(yīng)用程序退出時,用戶界面線程也會隨之終
35、止。工作者線程:該線程通常不需要用戶進行輸入,由后臺進行處理。因此,工作者線程又被稱為后臺線程。工作者線程和用戶界面線程的區(qū)別在于,工作者線程不用從CWinThread類派生。13.3 線程類(CWinThread)在MFC上,CWinThread類封裝了對線程的操作。下面對CWinThtead類中的成員函數(shù)和成員變量作具體介紹。其中,CWinThread類中常用的函數(shù)如下:(1)調(diào)用CreateThread()函數(shù)可以創(chuàng)建一個新的線程,該函數(shù)的原型如下:dwCreateFlags:表示線程創(chuàng)建的標志。nStackSize:表示線程堆棧的大小。lpSecurityAttrs:表示線程的安全屬性
36、。13.3 線程類(CWinThread)(2)調(diào)用SetThreadPriority()函數(shù)可以設(shè)置線程的優(yōu)先級,該函數(shù)的原型如下:其中,nPriority參數(shù)定義了線程的優(yōu)先級。其取值如下表所示。13.3 線程類(CWinThread)(3)調(diào)用GetThreadPriority()函數(shù)可以獲取線程的優(yōu)先級,該函數(shù)原型如下:(4)調(diào)用PostThreadMessage()函數(shù)可以向另一個CWinThread對象發(fā)送消息,該函數(shù)的原型如下:message:表示用戶定義消息的標識。wParam:表示消息的第一個參數(shù)。lParam:表示消息的第二個參數(shù)。13.3 線程類(CWinThread)(
37、5)調(diào)用SuspendThread()函數(shù)可以將線程的掛起計數(shù)加1,當線程的掛起計數(shù)大于0時,該線程將暫停執(zhí)行,稱之為掛起狀態(tài)。該函數(shù)的原型如下:(6)調(diào)用ResumeThread()函數(shù)可以將線程的掛起計數(shù)減1。當線程的掛起計數(shù)減少到0時,恢復(fù)線程的執(zhí)行。該函數(shù)的原型如下:13.3 線程類(CWinThread)在CWinThread類中,還需要重載一些函數(shù)來完成對線程的操作。(1)重載InitInstance()函數(shù)用于控制用戶界面線程實例的初始化工作,該函數(shù)的原型如下:(2)重載ExitInstance()函數(shù)用于控制清理操作,該函數(shù)的原型如下:(3)重載OnIdle()函數(shù)用于控制線程
38、空閑處理操作,該函數(shù)的原型如下:lCount:表示計數(shù)器。此外,CWinThread類中有以下幾個重要的成員變量。m_hThread:表示當前線程的句柄。m_nThreadID:表示當前線程的ID。m_pMainWnd:表示指向應(yīng)用程序主窗口的指針。13.4 線程的使用在MFC中,創(chuàng)建一個新的線程時,可以使用全局函數(shù)AfxBeginThread()。AfxBeginThread()有兩種原型,分別用于創(chuàng)建用戶界面線程和工作者線程。13.4.1 啟用用戶界面線程當啟用用戶界面線程時,調(diào)用AfxBeginThread()的原型如下:pThreadClass:表示用戶界面線程對象運程時類結(jié)構(gòu)指針。p
39、Param:表示傳遞給控制函數(shù)的參數(shù)。nPriority:表示線程的優(yōu)先級。nStackSize:表示線程堆棧的大小。dwCreateFlags:表示線程創(chuàng)建的標志。lpSecurityAttrs:表示安全屬性(SECURITY_ATTRIBUTES)結(jié)構(gòu)指針。13.4.1 啟用用戶界面線程另外,啟用用戶界面線程還可以先創(chuàng)建一個CWinThread類的對象,然后調(diào)用CreateThread()函數(shù)。代碼如下:13.4.2 啟用工作者線程當啟用工作者線程時,調(diào)用AfxBeginThread()的原型如下:pfnThreadProc:表示工作者線程的控制函數(shù)指針。pParam:表示傳遞給控制函數(shù)的
40、參數(shù)。nPriority:表示線程的優(yōu)先級。nStackSize:表示線程堆棧的大小。dwCreateFlags:表示線程創(chuàng)建的標志。lpSecurityAttrs:表示安全屬性(SECURITY_ATTRIBUTES)結(jié)構(gòu)指針。注意:函數(shù)的返回值是一個線程指針。一般情況下,需要保存該指針,以便于以后根據(jù)該指針來終止該線程。13.4.3 用戶界面線程在實際應(yīng)用過程中,有時需要在線程中創(chuàng)建對話框。此時,可以使用用戶界面線程來實現(xiàn)。在MFC中,創(chuàng)建用戶界面線程的具體步驟如下:(1)從CWinThread類派生一個子類。(2)在子類的InitInstance()函數(shù)中設(shè)置線程的主窗口。(3)調(diào)用Af
41、xBeginThread()函數(shù)創(chuàng)建用戶界面線程。13.4.3 用戶界面線程【示例13-1】創(chuàng)建用戶界面線程。在一個基于對話框的MFC應(yīng)用程序中,創(chuàng)建一個用戶界面線程用來啟動另外一個對話框。(1)創(chuàng)建一個基于對話框的MFC應(yīng)用程序sample1301。(2)設(shè)計對話框資源,如下圖所示。13.4.3 用戶界面線程(3)單擊【Insert】|【Resource】命令,彈出【Insert Resource】(插入資源)對話框。選擇Dialog結(jié)點,如左圖所示。(4)設(shè)計新插入的對話框資源,如右圖所示。13.4.3 用戶界面線程(5)雙擊新添加的對話框資源,為其添加相應(yīng)的類CSubDlg,如左圖所示。
42、(6)單擊【Insert】|【New Class】命令,彈出【New Class】對話框。添加一個CWinThread類的子類CSubThread,如右圖所示。13.4.3 用戶界面線程(7)添加并修改CSubThread類中的數(shù)據(jù)成員和成員函數(shù)。其中,SubThread.h文件中的代碼如下:SubThread.cpp文件中的代碼如下:13.4.3 用戶界面線程(8)在對話框類CSample1301Dlg的【創(chuàng)建用戶界面線程】按鈕中添加如下代碼:在【取消】按鈕中添加如下代碼:13.4.3 用戶界面線程(9)運行程序sample1301,彈出主對話框。單擊【創(chuàng)建用戶界面線程】按鈕,彈出【用戶界面
43、線程】對話框。當運行程序sample1301的同時,可以打開系統(tǒng)的任務(wù)管理器進行查看。當主對話框彈出時,進程中多了一個sample1301.exe進程。當彈出【用戶界面線程】對話框時,沒有相應(yīng)的進程出現(xiàn)。從上述內(nèi)容中可以看出,本例成功地創(chuàng)建了一個用戶界面線程。13.4.4 工作者線程創(chuàng)建工作者線程不需要使用CWinThread類的派生類,而是需要實現(xiàn)控制函數(shù)。在工作者線程的控制函數(shù)中,定義了線程的生命周期。當進入控制函數(shù)時,線程將被啟動。而當退出函數(shù)時,線程將被終止?!臼纠?3-2】創(chuàng)建工作者線程。在一個基于對話框的MFC應(yīng)用程序中,創(chuàng)建工作者線程,并在對話框進行初始化時啟用。(1)創(chuàng)建一個基
44、于對話框的MFC應(yīng)用程序sample1302。(2)設(shè)計對話框資源,如下圖所示。13.4.4 工作者線程(3)添加成員變量。為兩個ListBox控件添加成員變量,分別為m_list1和m_list2。其中,類別為Control,類型為CListBox。(4)為CSample1302Dlg類添加兩個自定義函數(shù),分別如下:(5)為控制函數(shù)添加代碼。其中,F(xiàn)irstThread()函數(shù)中添加的代碼如下:SecondThread()函數(shù)中添加的代碼如下:13.4.4 工作者線程(6)在對話框類CSample1302Dlg的OnInitDialog()函數(shù)中添加如下代碼:(7)修改Sample1302D
45、lg.h文件中的函數(shù)聲明,將線程函數(shù)聲明為static函數(shù)。 13.4.4 工作者線程(8)運行程序sample1302,結(jié)果如圖13.8所示。注意:如果不按照第(7)步驟對Sample1302Dlg.h文件進行修改,會出現(xiàn)如下錯誤提示:AfxBeginThread : none of the 2 overloads can convert parameter 1 from type unsigned int (void *)。13.5 線程的終止當一個線程終止時,關(guān)閉該線程所屬的所有對象句柄,將該線程對象狀態(tài)變?yōu)橛行畔⑻枲顟B(tài),并將該線程對象終止狀態(tài)STILL_ACTIVE改為退出碼。通常情況
46、下,線程終止分為兩種:正常終止和異常終止。13.5.1 正常終止線程對于用戶界面線程而言,使其正常終止只需在用戶界面線程中調(diào)用PostQuitMessage()即可。該函數(shù)的原型如下:nExitCode:表示線程的退出碼。對于工作者線程而言,當控制函數(shù)正常執(zhí)行到函數(shù)的結(jié)束點(return語句)后,該線程也就正常終止了。另外,用戶也可以選擇使用AfxEndThread()函數(shù)來終止該線程。AfxEndThread()函數(shù)的原型如下:13.5.2 異常終止線程異常終止是指線程內(nèi)部出現(xiàn)自身無法終止的情況,在其他線程中強行終止該線程。異常終止用于在緊急情況下安全退出控制。如果想要終止線程,可以使用Te
47、rminateThread()函數(shù)。該函數(shù)的原型如下:hThread:表示將要終止的線程句柄。該參數(shù)可以使用創(chuàng)建線程返回時返回的CWinThread從m_hThread成員變量中得到。dwExitCode:表示線程的退出碼。13.5.3 線程的退出碼根據(jù)線程的退出碼,可以判斷線程的執(zhí)行情況。使用GetExitCode()函數(shù)可以獲取工作者線程或用戶界面線程退出碼。該函數(shù)的原型如下:hThread:表示線程句柄。該參數(shù)可以使用創(chuàng)建線程返回時返回的CWinThread從m_hThread成員變量中得到。lpExitCode:表示接收返回的終止狀態(tài)的地址。13.5.3 線程的退出碼如果線程沒有被終止
48、,則終止狀態(tài)返回STILL_ACTIVE。如果線程已經(jīng)被終止,則返回的終止狀態(tài)可以是以下取值中的一個:在ExitThread()或TerminateThread()函數(shù)中指定的退出值。在線程函數(shù)的return語句中的返回值。線程所屬進程中的退出值。13.5.3 線程的退出碼想要獲取線程的退出碼,還要做一些其他工作。一般線程終止后,線程對象將被刪除,用戶不能獲取m_hThread句柄。想要解決這個問題,可以采用以下兩個辦法。(1)在創(chuàng)建線程后,設(shè)置線程對象的m_bAutoDelete成員變量為FALSE。這樣,CWinThread對象在線程終止后仍將存在。在退出應(yīng)用程序之前,還需要手動添加刪除C
49、WinThread線程對象的代碼。(2)單獨選擇保存線程句柄。在創(chuàng)建線程后,使用Win32函數(shù)DuplicateHandle()將m_hThread復(fù)制到另一個句柄。這樣,盡管對象被自動刪除了,但使用復(fù)制的句仍然可以獲取線程的退出碼。注意:采用第二種方法時,在復(fù)制句柄之前,線程不能終止。最安全的方法是在創(chuàng)建線程進使用CREATE_SUSPENDED掛起,復(fù)制好后,調(diào)用ResumeThread()函數(shù)恢復(fù)線程的執(zhí)行。13.6 線程的通信通常情況下,在次線程是為主線程服務(wù)的,這就預(yù)示著主線程和次線程之間會進行及時的通信。下面對線程間的通信作簡單介紹。13.6.1 通信原理在線程間進行通信的過程中,
50、需要用到以下幾個函數(shù)。其中,調(diào)用PostMessage()函數(shù)可以進行線程間的通信。該函數(shù)的原型如下:hWnd:表示消息發(fā)送的目的窗口句柄。Msg:表示將要發(fā)送的消息。wParam:表示消息的第1個參數(shù)。lParam:表示消息的第2個參數(shù)。13.6.1 通信原理調(diào)用PostThreadMessage()函數(shù)可以向某個線程發(fā)送消息,該函數(shù)的原型如下:idThread:表示線程標識。Msg:表示將要發(fā)送的消息。wParam:表示消息的第1個參數(shù)。lParam:表示消息的第2個參數(shù)。13.6.1 通信原理如果想要對消息進行外理,用戶界面線程和工作者線程的處理方式不同。在用戶界面線程中,有兩種方式對消
51、息進行處理。(1)使用消息映射宏ON_THREAD_MESSAGE。該宏的定義格式如下:message:表示消息標識ID。memberFxn:表示CWinThread消息處理函數(shù)的名稱。(2)使用PreTranslateMessage()函數(shù),直接對消息進行處理。該函數(shù)的原型如下:pMeg:表示包含消息的MSG結(jié)構(gòu)指針。13.6.1 通信原理在工作者線程中,可以使用GetMessage()函數(shù)對消息進行處理。該函數(shù)的原型如下:lpMsg:表示消息MSG結(jié)構(gòu)指針。hWnd:表示窗口句柄。wMsgFilterMin:表示第1個消息。wMsgFilterMax:表示最后一個消息。13.6.2 用戶界
52、面線程通信下面通過一個實例來介紹用戶界面線程間的通信。【示例13-3】實現(xiàn)用戶界面線程間的通信。(1)創(chuàng)建一個基于對話框的MFC應(yīng)用程序sample1303。(2)設(shè)計對話框資源,如下圖所示。(3)添加成員變量。其中,從上到下,各文本框?qū)?yīng)的成員變量分別為m_edit1、m_edit2和m_edit3。其中,m_edit1、m_edit2的類別為Value,類型為int。m_edit3的類別為Control,類型為CEdit。13.6.2 用戶界面線程通信(4)添加CWinThread類的派生類。單擊【Insert】|【New Class】命令,彈出【New Class】對話框。添加一個CWi
53、nThread類的子類CWinThread,如圖13.10所示。13.6.2 用戶界面線程通信(5)在CompareThread.h文件中添加如下代碼:在CompareThread.cpp文件中添加如下代碼:(6)在CSample1303Dlg類中添加一條自定義消息,代碼如下:13.6.2 用戶界面線程通信(7)重載CCompareThread類的PreTranslateMessage()函數(shù)。右擊CCompareThread類,在彈出的彈出式菜單中選擇【Add Virtual Function】菜單項,彈出【New Virtual Override for Class CCompareThr
54、ead】對話框。從左邊的列表框中雙擊【PreTranslateMessage】選項,將其移動到右邊的列表框中,如下圖所示。13.6.2 用戶界面線程通信(8)單擊【Add and Edit】按鈕,進入編輯區(qū)。在PreTranslateMessage()函數(shù)中添加代碼如下:13.6.2 用戶界面線程通信(9)為對話框類CSample1303Dlg添加一個成員變量,如下圖所示。該變量用于保存線程的標識。(10)在對話框類CSample1303Dlg的初始化函數(shù)中創(chuàng)建并啟動用戶界面線程,代碼如下:13.6.2 用戶界面線程通信(11)在【比較】按鈕的消息響應(yīng)函數(shù)中添加如下代碼:(12)運行程序sam
55、ple1303,結(jié)果如下圖所示。在運行程序時,單擊【比較】按鈕,并沒有直接對a、b的值進行比較,而是發(fā)送一條WM_CPMPARE的消息,交由CCompareThread類的PreTranslateMessage()函數(shù)進行處理。13.7 線程的同步在編寫多線程應(yīng)用程序時,經(jīng)常會出現(xiàn)線程間同步訪問共享資源的情況。多個線程同時訪問同一個共享資源將可能發(fā)生無法預(yù)知的錯誤。例如,一個線程正在更新數(shù)據(jù)集,而同時另外一個線程正在讀取數(shù)據(jù)。那么,第二個線程只會讀取一部分正確的數(shù)據(jù)。為了解決這個問題,Visual C+6.0提供了同步類。同步類包括同步對象和同步訪問對象。其中,同步對象分為4種,分別是CSem
56、aphore(信號量)、CCriticalSection(臨界區(qū))、CMutex(互斥量)和CEvent(事件)。下面對這些同步類分別進行介紹。13.7.1 同步訪問對象同步訪問對象提供了對同步對象的封裝。同步訪問對象分為兩種,分別是CSingleLock和CMultiLock。1CSingleLock如果一次只需要等待一個同步對象,可以使用CSingleLock類的對象。CSingleLock類的構(gòu)造函數(shù)如下:pObject:表示同步對象指針。該參數(shù)不能為NULL。bInitialLock:表示是否在初始化時對同步對象進行訪問。如果想要獲取同步對象,可以使用Lock()函數(shù)。該函數(shù)的原型如下
57、:dwTimeOut:表示同步對象等待的時間。13.7.1 同步訪問對象如果想要釋放同步對象,可以使用Unlock()函數(shù)。該函數(shù)的原型如下:lCount:表示要釋放的對象數(shù)。lPrevCount:表示同步對象接收的前一次的個數(shù)。如果想要判斷等待的同步對象是否被鎖定,可以使用IsLocked()函數(shù)。該函數(shù)的原型如下:13.7.1 同步訪問對象2CMultiLock如果在某個特定的時刻要使用多個同步對象,可以使用CMultiLock類的對象。CMultiLock類的構(gòu)造函數(shù)原型如下:ppObjects:表示同步對象數(shù)組指針。dwCount:表示同步對象數(shù)組元素的個數(shù)。bInitialLock:
58、表示是否在初始化時對同步對象進行訪問。13.7.1 同步訪問對象如果想要獲取同步對象,可以使用Lock()函數(shù)。該函數(shù)的原型如下:dwTimeOut:表示同步對象等待的時間。bWaitForAll:表示是否等待所有的同步對象。dwWakeMask:指定其他放棄等待的條件。13.7.1 同步訪問對象如果想要釋放同步對象,可以使用Unlock()函數(shù)。該函數(shù)的原型如下:lCount:表示要師范的對象數(shù),該參數(shù)必須大于0。lPrevCount:表示同步對象接收的前一次的個數(shù)。如果想要判斷等待的同步對象是否被鎖定,可以使用IsLocked()函數(shù)。該函數(shù)的原型如下:13.7.2 使用信號量實現(xiàn)線程同步
59、CSemaphore類對象代表一個“信號量”,可以允許一定數(shù)目的線程訪問某個共享資源。信號量對象中保存了當前同時訪問某個共享資源的線程計數(shù)。如果該計數(shù)值為0,則所有對這個CSemaphore類對象所控制資源的訪問將被放到一個隊列中進行等待,直到超時或計數(shù)值不為0。13.7.2 使用信號量實現(xiàn)線程同步CSemaphore類的構(gòu)造函數(shù)原型如下:lInitialCount:表示信號量對象初始化計數(shù)。該參數(shù)的值決定了在信號量對象建成后,能同時訪問其中資源的最大線程數(shù)目。該參數(shù)的取值在0IMaxCount之間。lMaxCount:表示信號量對象的最大計數(shù)。該參數(shù)必須大于0。pstrName:表示要創(chuàng)建的
60、信號量對象的名稱。lpsaAttributes:表示信號量對象的安全屬性的指針。該參數(shù)一般設(shè)置為NULL。13.7.3 使用臨界區(qū)對象實現(xiàn)線程同步CCriticalSection類對象代表一個“臨界區(qū)”。當多個線程訪問一個獨占性共享資源時,可以使用臨界區(qū)對象。在同一時刻,只允許一個線程可以擁有臨界區(qū)對象,進而訪問資源或是代碼段,而其他線程需要等待。CCriticalSection類的構(gòu)造函數(shù)原型如下:13.7.4 使用互斥量對象實現(xiàn)線程同步CMutex類對象代表一個“互斥量”?;コ饬繉ο髮儆谙到y(tǒng)內(nèi)核對象,它能夠使線程擁有對某個資源的絕對訪問權(quán)限。CMutex類的構(gòu)造函數(shù)原型如下:bInitiallyOwn:表示互斥
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢節(jié)職業(yè)技術(shù)學(xué)院《理財與稅收籌劃》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南冶金職業(yè)技術(shù)學(xué)院《績效管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江廣廈建設(shè)職業(yè)技術(shù)大學(xué)《勞動與美好生活》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧農(nóng)業(yè)職業(yè)技術(shù)學(xué)院《城鄉(xiāng)規(guī)劃原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年企業(yè)業(yè)務(wù)咨詢顧問勞動合同范文
- 2025年建筑項目融資合同案例
- 2025年智能停車管理與小區(qū)綠化系統(tǒng)工程合同
- 2025年汽車零部件供應(yīng)鏈合同樣本
- 2025年各類金融機構(gòu)借款合同示范文本
- 2025年電動牙刷區(qū)域代理合同
- DL-T-5115-2016混凝土面板堆石壩接縫止水技術(shù)規(guī)范
- 數(shù)據(jù)驅(qū)動歷史研究
- 危貨押運員考試答案(題庫版)
- QCT267-2023汽車切削加工零件未注公差尺寸的極限偏差
- 初中英語七選五經(jīng)典5篇(附帶答案)
- 《電力工程電纜設(shè)計規(guī)范》高壓、超高壓電力電纜及 制造、使用和運行情況
- 內(nèi)蒙古呼和浩特市2023年中考歷史試題(附真題答案)
- 《預(yù)防脊柱側(cè)彎》課件
- 教師工作職責培訓(xùn)非暴力溝通與沖突解決
- 學(xué)校保密教育培訓(xùn)課件
- 關(guān)于教師誦讀技能培訓(xùn)課件
評論
0/150
提交評論