三內存管理應用程序設計課件_第1頁
三內存管理應用程序設計課件_第2頁
三內存管理應用程序設計課件_第3頁
三內存管理應用程序設計課件_第4頁
三內存管理應用程序設計課件_第5頁
已閱讀5頁,還剩111頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、三、 內存管理應用程序設計內存管理的相關概念內存數據空間的動態分配內存代碼空間的動態分配2 1內存管理 主要任務對內存儲器進行分配、變換、保護和擴充,存儲管理還應該能夠在內存和外存之間交換數據和代碼。 在Windows操作系統下,存儲器被保護起來,程序和用戶無法直接訪問,需要在程序中通過靜態和動態兩種方式來訪問。Windows的內存管理完成物理內存和虛擬內存之間的交換,虛擬內存是32位的,多達4GB的大小,內存管理還提供了一個核心服務,完成內存映射文件、寫時復制內存和用戶程序使用的大量和稀疏內存的管理。 3兩種使用內存的基本方法靜態方法數組,例如 Student student501動態方法指

2、針,例如Student *student=new Studentcount+14內存管理 Windows NT在X86體系下虛擬地址空間的分布: 6例3-6 動態申請虛擬內存整數階乘計算到13就會出錯。怎么辦?使用動態申請的虛擬內存空間編寫計算任何數的階乘的程序。解體思路:計算較大數的階乘的計算一般使用數組來存放階乘的位數。但是C+中數組最大長度是10萬,這將影響使用的范圍。可以通過使用動態內存分配(指針)來解決。本程序采用動態申請虛擬內存空間的方法,不使用物理內存,而是使用虛擬內存,從而使求解問題的范圍擴大。階乘源代碼階乘執行代碼7函數VirtualAlloc用函數VirtualAlloc保

3、留或申請虛擬內存空間。該函數格式如下:LPVOID VirtualAlloc( LPVOID lpAddress, / 起始地址 DWORD dwSize, / 大小 DWORD flAllocationType, / 分配類型(MEM_COMMIT等) DWORD flProtect / 保權限(PAGE_READWRITE等));9函數VirtualFree使用函數VirtualFree釋放虛擬內存,函數格式:BOOL VirtualFree( LPVOID lpAddress, /起始地址 DWORD dwSize, /大小 DWORD dwFreeType /釋放類型(MEM_RELE

4、ASE等)); 10源程序#include #include int lfac(int *a, int n) int sum,sc; for(int i=0;in*1024;i+) /空間清零ai=0; a0=1; /最低位設為1 for(i=2;i=n;i+) /n的階乘的循環 sc=0;for(int j=0;j0) return -1; else return 0;11舉例求5!a0=1; /最低位設為1for(i=2;i=n;i+) /n的階乘的循環 sc=0; for(int j=0;jn*1024;j+) /階乘每一位處理的循環 sum=aj*i+sc; /上一次進位值和當前計算結

5、果求和 sc=sum/10; /存放進位數值 aj=sum%10;/將余數存入數組 i =2(2!=2)i =3(3!=6)i =4(4!=24)i =5(5!=120)j=0sum=2sc=0a0=22!=a0=2j=0sum=6sc=0a0=63!=a0=6j=0sum=24sc=2a0=4j=0sum=20sc=2a0=0j=2sum=20sc=0a2=1j=1sum=2sc=2a1=23!=a1a0=24j=1sum=12sc=1a1=26!=a2a1a0=12012主函數int main() char *p; int n; coutn; if(n0) couta輸入數據錯;retur

6、n 1; int * lpBase =(int *) VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_READWRITE); /保留 n*10240總的地址空間 int * lpPage = (int *)VirtualAlloc (lpBase + 0, n*1024,MEM_COMMIT,PAGE_READWRITE); /提交n*1024的頁地址空間 bool flag=FALSE; if(lfac(lpPage,n)0) cout溢出=0;i-) if(flag | lpPagei0) flag=TRUE; coutlpPagei; /輸出每一位 c

7、outendl; VirtualFree (int *)lpPage + 0,n*1024,MEM_DECOMMIT);/ 對頁地址解除提交內存VirtualFree (lpBase,n*10240,MEM_RELEASE); / 釋放整個范圍的地址return 0;例3-6源代碼例3-6執行代碼13程序執行結果14例3-7 編寫計算圓周率的程序解題思路 已經提供可以計算任意位小數的圓周率的動態鏈接庫文件“pi.dll”和靜態庫文件“pi.lib”,需要將它們拷貝到工程的“Debug”子目錄中。 在“pi.dll”中存在計算圓周率的函數ComputPI,格式如下: int ComputPI(l

8、ong bits); 其中,參數bits代表要求的圓周率的小數位數;返回值是0表示成功,是1表示失敗。16程序步驟 建立“Win32控制臺工程”,工程名稱為“Example3_7”; 在工程中添加一個C+源程序文件,文件名稱為“Example3_7.cpp”; 在工程中加入文件“pi.lib”。17程序執行結果19 四、設備與文件管理應用程序設計設備管理、文件管理于人機接口管理的相關概念設備管理程序設計文件設備管理程序設計人機接口管理程序設計 20 1. 設備管理與程序設計主要任務 根據確定的設備分配原則對設備進行分配,使設備與主機能夠并行工作,為用戶提供良好的設備使用界面,以提高設備與設備之

9、間,設備與之間,進程與進程之間的并行性,從而提高整個操作系統的效率。21設備和內存之間數據傳輸方式操作系統的設備管理程序通過四種控制方式完成設備與內存之間的數據傳送。 1程序直接控制方式 中斷控制方式 DMA方式 通道方式 22(1)循環探測I/O方式通過設置一個測試I/O設備“忙/閑”狀態標志的觸發器。若它置“閑”,則執行I/O操作,若它置“忙”,則CPU不斷對它進行監測,直至設備“閑”下來為止。在早期計算機系統中主要采用這種方式。由于CPU速度比I/O設備速度高得多,而循環測試I/O方式使得CPU與外部設備只能串行工作,因此CPU絕大部分時間都處于等待I/O設備完成的循環測試中,CPU資源

10、浪費極大。 優點: 管理簡單 缺點: 浪費了CPU資源 23(2)中斷處理方式為了克服循環測試方式的缺點(CPU必須不斷主動測試I/O設備是否空閑),引入中斷處理技術。該方式的核心就是使I/O設備具有主動“匯報”的能力;每當完成I/O操作后,便給CPU發一個通告信號。只有當CPU接到I/O設備中斷請求后,才處理I/O操作。 優點: 速度快,提高了資源的利用率。 缺點:I/O操作還依賴于CPU,如果I/O處理頻繁,CPU也將很忙。特別是對字符設備,傳送一個字符,就要響應一次中斷處理;若字符I/O設備很多、傳輸量很大時,CPU可能完全陷入I/O處理中而不能自拔。示例24(4)通道(Channel)

11、方式要想把CPU從繁忙的雜務中解放出來,必須使I/O設備的管理不再依賴于CPU。“通道”是具有相對獨立的I/O處理能力的裝置。如大型機的前端機,PC機的Intel 8090(I/O通道)等。在通道方式下,I/O處理變成了處理機之間的通訊問題。在采用通道方式的I/O系統中,CPU有兩個作用:一是將I/O操作任務下達給通道,由通道代替CPU專門處理I/O工作;二是隨時了解通道、控制器和設備工作的情況。 26設備管理示意圖 CPUCH1CH2CHnCU1CU2CUmDV1DV2DV3DV4DVkDVk+1通道控制器設備27例3-8 光驅管理程序算法分析 通過使用媒體控制接口(MCI) 的API函數,

12、實現對光驅的操作。 編寫命令行式的程序,格式為: 光驅操作命令 光驅號 操作參數 接收命令行的argv1參數,代表光驅盤符,和argv2參數,代表操作命令(O表示打開,C表示關閉); 根據argv2參數的值,分別傳遞argv1參數調用函數OnCdopen打開光驅和OnCdclose關閉光驅。29解題思路使用“mmsystem.h”中的媒體控制接口(MCI) API函數;MCI_OPEN_PARMS /打開光驅參數結構體MCI_STATUS_PARMS /光驅狀態參數結構體ZeroMemory函數 /光驅參數賦零,將光驅類型 /參數設為CD_AUDIOmciSendCommand函數 /發送設備

13、打開命令根據命令參數打開光驅和關閉光驅最后釋放設備存儲。30對話框框架程序用到的元素MCI_OPEN_PARMS結構體 MCI_STATUS_PARMS結構體 mciSendCommand函數 ZeroMemory函數 31結構體說明光驅管理程序typedef struct tagMCI_OPEN_PARMS /打開光驅參數 DWORD dwCallback; / MCIDEVICEID wDeviceID; WORD wReserved0; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpstrAlias; MCI_OPEN

14、_PARMS;typedef struct tag MCI_STATUS_PARMS /光驅狀態參數 DWORD dwCallback; DWORD dwReturn; DWORD dwItem; DWORD dwTrack; MCI_STATUS_PARMS;32設備控制函數說明MCIERROR mciSendCommand( /發送打開設備命令 MCIDEVICEID IDDevice, /設備標示號 UINT uMsg, /命令消息 DWORD fdwCommand, /命令消息標志 DWORD dwParam /命令消息參數);void ZeroMemory ( /初始化數據函數 PV

15、OID Destination, /填充地址 DWORD Length /填充字節大小);33源程序#include #include #include /MCI API函數頭文件#pragma comment(lib,winmm)void CD_OpenCloseDrive(BOOL bOpenDrive, TCHAR cDrive)MCI_OPEN_PARMS op; /光驅打開參數結構MCI_STATUS_PARMS st; /光驅狀態參數結構DWORD flags;TCHAR szDriveName4; /光驅盤符變量strcpy(szDriveName, X:);:ZeroMemor

16、y(&op, sizeof(MCI_OPEN_PARMS); /光驅參數賦值為0op.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO; /光驅類型參數為CD_AUDIOif (cDrive 1) szDriveName0 = cDrive; op.lpstrElementName = szDriveName; /光驅盤符參數為函數參數 flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT | MCI_OPEN_SHAREABLE; else flags = MCI_OPEN_TYP

17、E | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE; if ( !mciSendCommand(0,MCI_OPEN,flags,(unsigned long)&op) ) /發送設備打開命令st.dwItem = MCI_STATUS_READY;if(bOpenDrive) mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_OPEN,0); /打開光驅else mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_CLOSED,0); /關閉光驅mciSendComm

18、and(op.wDeviceID,MCI_CLOSE,MCI_WAIT,0); /釋放設備存取34子函數源程序void OnCdopen(CString m_Letter) /打開光驅子函數 CString new_letter = m_Letter; /取得輸入光驅盤符CD_OpenCloseDrive(TRUE, new_letter0);/打開指定盤符光驅m_Letter = ;void OnCdclose(CString m_Letter) /關閉光驅子函數 CString new_letter = m_Letter; /取得輸入光驅盤符CD_OpenCloseDrive(TRUE,

19、new_letter0);/關閉指定盤符光驅m_Letter = ;35主函數int main(int argc, char *argv)if (argc 3) couta使用方法: Example3_8 ; return 1; if( argv20=O ) OnCdopen(argv1); else OnCdclose(argv1); return 0;例3-8源代碼例3-8執行代碼36例3-9 雙緩沖顯示位圖程序 在程序設計中,普通的繪圖方法是一個圖形一個圖形地直接繪制到屏幕上,這樣做的缺點是會引起屏幕閃爍。采用雙緩沖技術可以減少屏幕的閃爍。37解題思路本程序采用單文檔/視圖框架;本程序中

20、定義一個內存顯示設備對象MemDC、屏幕顯示設備對象pDC和位圖對象m_Bitmap;其中CBitmap是MFC提供的一個表示位圖文件的位圖類,一個位圖具有它的類型、大小和顏色值等;通過MemDC的函數CreateCompatibleDC建立與屏幕顯示兼容的內存顯示設備;通過m_Bitmap的函數CreateCompatibleBitmap建立一個與屏幕顯示兼容的位圖;通過MemDC的函數SelectObject將位圖選入到內存顯示設備中;接著在內存位圖中進行繪制;繪制完成后通過pDC的函數BitBlt將內存中的圖拷貝到屏幕上進行顯示;使用完成后,需要清除位圖對象m_Bitmap和內存顯示設備

21、MemDC。38程序步驟建立單文檔/視圖框架程序,工程名為“Example3_9”;在文件“Example3_9View.cpp”的OnDraw(CDC* pDC) 函數中添加如下代碼:CDC MemDC; /首先定義一個顯示設備對象CBitmap m_Bitmap; /定義一個位圖對象 int nWidth=500; /繪圖寬度int nHeight=500; /繪圖高度MemDC.CreateCompatibleDC(NULL); /建立與屏幕顯示兼容的內存顯示設備m_Bitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); /建立一個與屏幕顯示

22、兼容的位圖MemDC.SelectObject(&m_Bitmap); /將位圖選入到內存顯示設備中MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(192,192,192); /畫實心矩形 MemDC.Ellipse(100,100,400,400); /畫圓MemDC.MoveTo(100,100); /移動到指定位置MemDC.LineTo(400,400); /畫直線MemDC.TextOut(220,250,“歡迎”); /顯示文字pDC-BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY); /將內存中的圖拷

23、貝到屏幕上進行顯示m_Bitmap.DeleteObject(); /清除位圖對象MemDC.DeleteDC(); /清除內存顯示設備程序運行即可得到結果.39程序運行結果 例3-9執行代碼40 2. 文件管理與程序設計主要任務有效地管理文件的存儲空間,合理地組織和管理文件系統,為文件訪問和文件保護提供更有效的方法及手段,并把這種存儲、檢索、共享和保護文件的手段提供給操作系統本身和用戶,以達到方便用戶和提高資源利用率的目的。 41文件有關概念文件 一組相關信息的集合,文件具有一定的數據結構、數據、分類屬性和訪問權限。 文件從物理上,由位(bit)、字節(byte)、塊(block)、頁(pa

24、ge)和盤(disk)等組成; 物理結構有連續文件結構、串聯文件結構和索引文件結構。 從邏輯上,有字(word)、字段(segment)、記錄(record)、虛擬塊(virtual block)、文件(file)、文件目錄(file directory)、文件夾(folder)和文件卷(volume)等。 邏輯結構可分為兩大類:字符流式的無結構文件和記錄式的有結構文件。42文件系統文件管理程序和所管理的全部文件(文件與目錄的集合)。 最常用的一些文件類型是: .exe 可執行文件 .wav聲音文件.lib靜態庫文件 .jpg 圖片文件.dll動態庫文件 .doc Word文件.ocx 組件文

25、件 .mdb Access數據庫文件.cpp C+源程序文件 .log日志文件.java Java源程序文件 .bmp 位圖文件.html 網頁文件 .ini初始化文件.chk磁盤整理文件等等43文件保護文件的保護可以通過改變文件屬性為可讀、可寫、可執行、隱藏和歸擋來進行。 44文件系統格式Windows操作系統采用FAT32和NTFS兩種文件系統格式:其中FAT32采用文件目錄表(file directory table,FDT)和文件分配表(file allocate table,FAT)相結合的方式來管理文件。FAT32的文件分配表是32位的,增強了對磁盤的管理能力,減少了磁盤空間的浪費

26、。NTFS采用壓縮存儲方式,具有文件權限的管理功能,能夠更好地管理文件。45文件結構文件的結構包括物理結構和邏輯結構。文件的物理結構又稱為文件的存儲結構,它是指文件在外存上的存儲組織形式,與存儲介質的存儲性能有關。常用的物理結構有連續文件結構、串聯文件結構和索引文件結構。文件的邏輯結構是用戶所觀察到的文件組織形式,是用戶可以直接處理的數據及結構,它獨立于物理特性,又稱為文件組織(FILE ORGANIZATION)。文件的邏輯結構可分為兩大類:字符流式的無結構文件和記錄式的有結構文件。46文件的邏輯結構文件的邏輯結構分為兩種形式:一種是有結構的記錄式文件,它由一組相關記錄組成。文件中的記錄可按

27、順序編號為記錄1、記錄2、記錄n。 例如,數據庫文件。另一種是無結構的流式文件,它是指由字符序列集合組成的文件。 例如,一個Word文件。在UNIX中,所有文件都被看作是流式文件,包括打印機、顯示器等I/O設備。示例示例47文件的物理結構是指文件在存儲設備上的存放形式。文件在邏輯上是連續的,但在存儲設備上存放時卻有幾種不同形式:連續文件。又稱順序文件。其特點是文件存放在存儲設備的相臨的物理塊中,即連續存放。串聯文件。又稱鏈表文件。它采用非連續的物理塊來存放文件信息,將文件的所有物理塊串聯組成一個鏈表,塊之間通過指針鏈接。索引文件。索引文件要求系統為每一個文件創建一張索引表,索引表的表項給出文件

28、的邏輯塊號和物理塊號的對應關系。Hash(散列)文件。它采用計算尋址方法,將記錄鍵值通過Hash函數計算轉換成相應記錄的地址。示例48文件的目錄結構文件組織體系中還包括文件的目錄結構。用戶使用的是文件的邏輯結構,系統使用的是文件的物理結構,在兩種不同的組織結構之間似乎應該有銜接的紐帶。銜接的紐帶就是文件的目錄結構。通過文件的目錄結構,將文件的邏輯結構和文件的物理結構聯系在了一起。49例3-10 驅動器瀏覽程序解題思路:本程序顯示操作系統中的所有盤符,程序中用到MFC和Windows API函數;CString代表一個字符串對象;SetAt 函數改變字符串某個位置的字符;GetLength函數取

29、得字符的長度;GetBuffer函數將一個CString型的字符串轉換為LPTSTR類型的指定長度的字符串;宏變量DRIVE_REMOVABLE、DRIVE_FIXED、DRIVE_REMOTE、DRIVE_CDROM和DRIVE_RAMDISK分別表示不同類型的盤,在程序代碼中有說明。50程序步驟 調用API函數GetLogicalDrives取得“我的電腦”中的所有邏輯盤,并得到一個DWORD類型的數,其中的某一位為1時表示該位代表的盤存在。其中GetLogicalDrives函數的格式為: DWORD GetLogicalDrives(VOID);通過提取dwDriveList的每一位,

30、得到所有盤符;調用API函數GetDriveType判別每一盤符的類型,其中GetDriveType函數的格式為: UINT GetDriveType(int nDrive) 51程序#include #include void main() int nPos = 0; UINT nCount = 0; CString strDrive = ?:; DWORD dwDriveList = GetLogicalDrives (); /取得我的電腦的所有盤 CString cTmp; UINT nType; cout我的電腦包含如下盤:endl; while (dwDriveList) if (d

31、wDriveList & 1) cTmp = strDrive; strDrive.SetAt (0, 0 x41 + nPos); /將數字表示的盤符轉換為字母 coutstrDrive.GetBuffer(strDrive.GetLength(); /將字符串轉換為指定格式 nType = GetDriveType (LPCTSTR) strDrive); /取得每個盤的類型 switch (nType) case DRIVE_REMOVABLE:cout可移動盤endl;break; case DRIVE_FIXED: cout邏輯硬盤endl; break; case DRIVE_RE

32、MOTE:cout網絡盤endl;break; case DRIVE_CDROM:coutCDROM盤endl; break; case DRIVE_RAMDISK:coutRAM盤endl;break; default: cout未知類型盤= 1; /準備取得下一個盤符 nPos+; cout共:nCount個盤endl; 52程序運行結果 例3-10執行代碼53例3-11 判別指定文件或文件夾屬性算法分析從命令行輸入指定的文件或目錄名稱,可以包含通配符( “*” 和“?”)。命令格式為: 命令 文件名使用FMC的CFileFind類的FindFile函數對指定文件進行查找。CFileFin

33、d類的FindNextFile函數對指定文件繼續進行查找(因指定的文件可能含有通配符)。分別通過函數GetFileName、 GetFilePath、IsDirectory、IsReadOnly和GetCreateTime得到文件的名稱、路徑、是否目錄、是否只讀和建立時間等,并顯示相應結果。54 解題思路本應用用到MFC的CFileFind類的FindFile、 FindNextFile、GetFileName、 GetFilePath、IsDirectory、IsReadOnly和GetCreateTime函數;還用到CTime類的GetYear、GetMonth、GetDay函數取得文件建

34、立的時間(年、月、日)。55 源程序#include#includevoid main(int argc,char *argv)if(argc2) cout 使用格式:Example3_11 endl; exit(1); CFileFind finder;BOOL bWorking = finder.FindFile(argv1); /取得命令行參數指定的文件名,并查詢while (bWorking)bWorking = finder.FindNextFile(); /繼續查詢下一個文件cout 文件名稱:(LPCTSTR) finder.GetFileName() endl;cout 文件路

35、徑:(LPCTSTR) finder.GetFilePath() endl;if(finder.IsDirectory( ) cout 目錄endl;elsecout 文件 endl;if(finder.IsReadOnly( ) cout 只讀 endl;CTime fileTime;finder.GetCreationTime(fileTime); /取得文件建立時間cout 建立時間是:fileTime.GetYear()年;cout fileTime.GetMonth()月;cout fileTime.GetDay()日 endlendl;56程序運行結果 例3-11執行代碼57 例3

36、-12 讀取位圖文件屬性程序算法分析 從命令行輸入指定的位圖文件名稱; 命令格式為:命令 位圖文件名 定義位圖文件頭結構變量BitmapFileHeader; 定義位圖信息結構變量BitmapInfo; 打開指定文件; 使用函數fread分別讀取位圖文件頭和位圖信息; 關閉指定文件。并顯示位圖文件名稱、位圖文件類型、圖像寬度、圖像高度和每個像素的位數。58 解題思路 位圖文件是Windows操作系統中很重要的一種圖形格式,本例是對位圖文件的簡單操作。本程序用到的結構體和函數有: BITMAPFILEHEADER /位圖文件頭結構體 BITMAPINFO /位圖信息結構體 fread()函數 /

37、文件讀函數59BITMAPFILEHEADER格式位圖文件頭結構體為: typedef struct tagBITMAPFILEHEADER WORD bfType; /文件類型 DWORD bfSize; /文件大小 WORD bfReserved1; /文件保留1 WORD bfReserved2; /文件保留2 DWORD bfOffBits; / ; 60位圖信息結構體位圖信息結構體BITMAPINFO的格式為:typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; /位圖像素、像素位數 RGBQUAD bmiColors1;

38、/顏色 BITMAPINFO;61Fread函數函數fread的格式如下:size_t fread( void *buffer, /文件緩沖區 size_t size, /緩沖區塊長度 size_t count, /緩沖區塊個數 FILE *stream /文件流指針 );62源程序#include#include#includevoid main(int argc,char *argv)if(argc2) cout用法:Example3_12 endl; exit(1); BITMAPFILEHEADER BitmapFileHeader; /定義位圖文件頭結構變量BITMAPINFO Bi

39、tmapInfo; /定義位圖信息結構變量 FILE *fp=fopen(argv1,rb); /打開命令行指定的文件if(fp=NULL) cout文件:argv1打開錯誤endl; exit(1); fread(&BitmapFileHeader,sizeof(BITMAPFILEHEADER),1,fp); /讀位圖文件頭fread(&BitmapInfo,sizeof(BITMAPINFO),1,fp); /讀位圖信息fclose(fp); /關閉文件cout位圖文件名稱為:argv1endl; cout位圖文件類型為:(char)BitmapFileHeader.bfType;cou

40、t(char)(BitmapFileHeader.bfType/0 x100)endl;cout位圖文件的大小:BitmapFileHeader.bfSizebytesendl;cout圖像寬度:BitmapInfo.bmiHeader.biWidth點endl;cout圖像高度:BitmapInfo.bmiHeader.biHeight點endl;switch(BitmapInfo.bmiHeader.biBitCount) /每個像素的位數 case 0: coutJPEG圖endl;break; case 1: cout單色圖endl;break; case 4: cout16色圖end

41、l;break; case 8: cout256色圖endl;break; case 16: cout64K圖endl;break; case 24: cout16M真彩色圖endl;break; case 32: cout4G真彩色圖endl;break; default: cout單位像素位數未知GetSafeHwnd()取得; lpOperation可以是“open”(打開)、“print”(打印)和“explore”(瀏覽目錄)、 參數lpFile為需要處理的文件名、 參數lpParameters為文件參數,參數pDirectory為文件目錄,參數nShowCmd為窗口打開的大小(SW

42、_SHOWNORMAL、SW_SHOWMAXIMIZED等)。66程序步驟在VC+中建立文檔視圖的程序框架,工程命名為“Example3_15”;加入一個新對話框,并按下列要求設計對話框資源:對話框資源號為:“IDD_STUDENTDIALOG”;對話框窗口標題為:“增加學生期末考試成績”;設置對話框中對象的屬性;放置6個靜態文本控件,6個編輯文本控件,2個按鈕控件,以及對應的控件變量。在工程中增加一個Student類:創建菜單、修改菜單屬性;在類“Example3_14View”中增加成員變量:public:int count;Student student501;在文件“Example3_

43、14View.cpp”中加入操作代碼。67 Student 類成員public:int No;CString Name;float MathScore,EnglishScore,ComputerScore, AverageScore;Student()MathScore=EnglishScore=ComputerScore=AverageScore=0;68 CExample3_14View()的代碼#include Student.h#include StudentDialog.h CExample3_14View:CExample3_14View()count=0;69 CExample3

44、_14View:OnAdd() 代碼void CExample3_14View:OnAdd() CStudentDlg dlg; dlg.m_Count=count; int result=dlg.DoModal(); if(result=IDOK) studentcount.No=dlg.m_No;studentcount.Name=dlg.m_Name;studentcount.MathScore=dlg.m_MathScore;studentcount.EnglishScore=dlg.m_EnglishScore;studentcount.ComputerScore=dlg.m_Com

45、puterScore;studentcount.AverageScore=(studentcount.MathScore+studentcount.EnglishScore+studentcount.ComputerScore)/3;count+; 70 CExample3_14View:OnShow()代碼void CExample3_14View:OnShow()FILE *file=fopen(Student.txt,wt);char *p;char p1256;p= 學生期末考試成績單 rn學號 姓名 數學 英語 計算機 均分rn;fputs(p, file);p=rn;fputs(p

46、, file);for(int i=0;iGetSafeHwnd(), open, Student.txt, NULL, NULL, SW_SHOWNORMAL);71CExample3_14View:OnTotal()代碼void CExample3_14View:OnTotal() FILE *file=fopen(StudentTotal.txt,wt); char *p;char p1256; p= 學生總成績單 rn人數 數學 英語 計算rn; fputs(p, file); p=rn; fputs(p, file); studentcount.MathScore=0; studen

47、tcount.EnglishScore=0; studentcount.ComputerScore=0; for(int i=0;iGetSafeHwnd(), open, StudentTotal.txt, NULL, NULL, SW_SHOWNORMAL);72 CExample3_14View:OnPrint()代碼void CExample3_14View:OnPrint() ShellExecute(this-GetSafeHwnd(), print, Student.txt, NULL, NULL, SW_SHOWNORMAL);73 CExample3_14View:OnTot

48、alprint()代碼void CExample3_14View:OnTotalprint()ShellExecute(this-GetSafeHwnd(), print, StudentTotal.txt, NULL, NULL, SW_SHOWNORMAL);74 例3-14運行結果 (b)數據輸入 (c)學生成績單 (d)學生統計成績單圖3-44 例3-14的運行結果例3-14執行代碼75作業、思考題作業:第3章 一、二、三題的全部答疑時間:星期四、五:下午:4:006:00點答疑地點:計教中心505房間76結束語歡迎參加到中心網站軟件基礎課程的學習討論中來。中心網址: http:/我的

49、E-mail地址: LZQ 謝謝,再見!77Cstring類Cstring類是MFC中提供的一個有關字符串操作的應用程序類。它的定義放在頭文件中。其成員函數有:SetAt(int nIndex,TCHAR ch)替換指定位置上的字符GetAt(int nIndex)返回指定位置的字符GetLength()返回字符串的長度GetBuffer()將Cstring型字符串轉換為LPTSTR型字符串Insert()在字符串指定位置插入子串MakeReverse()將字符串中字符倒序Format()格式化輸出Find()返回指定字符在字符串中的位置返回78MFC的概述MFC是一個Windows應用程序框

50、架,它定義了應用程序的結構,并實現了標準的用戶接口。MFC提供了管理窗口、菜單、對話框的代碼,可實現基本的輸入/輸出和數據存儲。使用MFC庫,可以在Windows軟件開發專家的工作基礎上建立自己的應用程序。應用程序框架的核心是“文檔-視圖”結構。文檔類的作用是將應用程序的數據保存在文檔類對象中,視圖類的作用是顯示數據和編輯數據。MFC庫協調著文檔、視圖、框架窗口以及應用程序對象之間的相互作用。 79MFC類功能簡介根類CObjectMFC應用結構類應用和線程支持類、命令例程類、文檔類、文檔模板類窗口、對話和控件類 CWnd類、框架窗口類、對話框類、視圖類、控件類、控件條類菜單類繪圖和打印類、輸

51、出(設備上下文)類、繪圖工具類簡單的數據類型類數組、列表和映射類文件和數據庫類文件I/O類、DAO類、ODBC類Internet和網絡類OLE類調試和異常類80MFC類層次 MFC的類可分為兩種:從CObject派生的類及非派生類。CObject應用結構類文件服務類繪圖工具類框架窗口類CCmdTargetCWndCDCCFile所有窗口的基類CFrameWnd對話框類CDialog視圖類CView控件類CAnimateCtrl應用對象類CWinAppCDocumentCDocTemplate文檔類文檔模板類CMenu菜單類CArray數組類CList列表類CMap映射類CGdiObject返回

52、81CDC類MFC的類中與圖形操作有關的類有兩種:一種是CDC(Class Device Context)類、一種是GDI(Graphic Device Interface)對象類。GDI圖形設備接口是Windows提供的一個圖形操作的抽象的接口,通俗地講是各種關于圖形操作的函數庫。Windows不允許應用程序直接訪問硬件,而是通過GDI間接地和硬件打交道(通過“設備環境”DC)。CDC類主要功能是完成繪圖功能和環境的建立。82CDC類中常用的函數及功能 BitBlt()TextOut()LineTo()Ellipse()FillRect()MoveTo()Ractangle()Pie()Po

53、lygon()GetTextColor()SelectStockObject()SetWindowOrg()SetWindowExt()把位圖從一個DC拷貝到另一個DC繪制文本繪制線條繪制橢圓或圓用給定的畫筆的顏色填充矩形設置畫筆的位置繪制矩形繪制餅圖繪制多邊形獲取文本的顏色選取GDI繪圖對象設置窗口中坐標系中的原點設置窗口的范圍83CDC類的使用方法對于顯示器類型的DC調用CDC*CWnd:GetDC()函數來獲得指向窗口的工作區的DC指針;利用得到的DC指針,調用CDC類的函數完成繪制工作;使用ReleaseDC()釋放獲得的DC。對于內存型的DC調用CDC*CWnd:CreateComp

54、atibleDC()函數來創建兼容設備環境;利用得到的DC對象,調用CDC類的函數,來完成繪制工作;使用DeleteDC()刪除創建的DC。返回84OnDraw()函數的使用方法在Windows中是不允許直接訪問顯示硬件的,要控制顯示的對象,需要通過和窗口關聯的“設備環境”與顯示硬件進行通信。設備環境是由Visual C+的CDC類對象來表示的,該對象以指針的形式作為參數傳遞給了OnDraw函數,有了這個設備環境指針,就可以在OnDraw函數完成各種各樣的繪制工作。返回例如,在Exaple3_9工程文件中有: void CExaple3_9View:OnDraw(CDC* pDC)CExapl

55、e3_9Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here85設備管理有關的數據結構為了對系統中的設備實行有效的管理,設置了一整套數據結構,包括:系統設備表(SDT)、設備控制表(DCT)、控制器控制表(COCT)以及通道控制表(CHCT),稱這些表格的數據為“設備管理數據基”。也可以說,設備的管理,實際上是對這些相關數據的表格的管理。 86SDT 系統設備表(System Device Table)SDT表記錄著系統中全部標準I/O設備,一種設備一個表項。 內容包括:

56、設備1設備i .SDT設備i特征信息設備類設備標識符進程標識符設備接口模塊標識符 每一種設備又建立相應的設備控制塊、控制器控制塊和通道控制塊。87DCT 設備控制表(Device Control Table)為了實現對設備的控制,每一種設備都在DCT表中有一個表項,內容包括: DCTDCT1DCTi設備類型設備標識符設備狀態(忙/閑)與設備連接的控制器表指針重復執行次數或時間 *設備隊列隊頭指針設備隊列隊尾指針注:表示若出錯,重復執行的次數或時間。88COCT控制器控制表(COntroller Control Table)為了實現對控制器的控制,每一個控制器都在COCT表中有一個表項,內容包括

57、: COCTCOCT1COCTi控制器標識符控制器狀態(忙/閑)與控制器連接的通道表指針控制器隊列隊頭指針控制器隊列隊尾指針89CHCT 通道控制表(CHannel Control Table)為了實現對通道的控制,每一個通道都在CHCT表中有一個表項,內容包括: CHCTCHCT1CHCTi通道標識符通道狀態(忙/閑)與通道連接的控制器表指針通道隊列隊頭指針通道隊列隊尾指針90基于數據基的管理示意圖 SDTDCTCOCTCHCT 申請I/O 申請控制器 申請通道 隊列 隊列 隊列 設備管理程序返回91與分配策略有關的因素I/O設備的固有屬性I/O設備的分配算法設備的安全性與設備的無關性 92

58、 I/O設備的固有屬性設備屬性不同要采用不同的分配方式。獨享設備 是一些慢速的設備,它不允許交叉使用,并在使用過程中需要人工干預。因此,一旦占用,只能到用完才能釋放、收回。共享設備 如磁盤,其定位操作時間短,可供直接存取操作,可由多進程共享使用,所以采用共享分配方式。共享設備在系統中主要用于存儲文件。 93 I/O設備的分配算法I/O調度程序的分配策略與進程調度策略基本相同,但由于I/O操作一旦啟動,就不能停止的特點,因此,不能采用進程調度的時間片輪轉法。 先請求先分配 當多個進程對同一個設備提出I/O請求時,系統按請求的先后次序將進程排隊。設備分配程序將I/O設備分配給隊列中第1個進程。優先

59、數最高優先 系統優先響應優先數最高的進程對I/O設備的請求。對優先數相同的I/O請求,則按先請求先分配的原則處理。 94 設備分配的安全性在有些系統下,出于安全的考慮,限定一個進程只能提出一個I/O設備請求,以防止可能產生“死鎖”,導致設備分配不安全。設備分配程序在多請求方式中,為保證不發生死鎖,一般要采取預防發生死鎖的措施。 95 與設備無關性為提高系統的可適應性和可擴展性,應使用戶程序和實際使用的物理設備無關。為此引入邏輯設備名和物理設備名的概念。系統規定,在用戶程序中只允許使用邏輯設備名。與設備無關性通常是通過系統提供的邏輯設備和物理設備的映象表來實現的(也稱為進程連接表PAT。若某邏輯

60、設備已連接到相應的物理設備上,則PAT表中該物理設備表項由該類設備的邏輯設備名和物理設備名組成)。 返回96文件系統的組織基本概念 文件卷(Volume)用于存放文件的存儲介質 的統稱。一個邏輯盤就是一個文件卷。 塊(Block)文件系統中,用來存儲、傳輸文件信息的單位。定長(例如512或1024個字節)。 塊長度 不同文件系統,塊長度不一樣,通常 取2n ;MS-DOS中,用“簇”(2n 個扇區) 作為塊長度單位,UNIX中,用“頁”作為 長度單位。n97基本概念(續) 文件構成: 為便于管理,一個文件由兩個部分組成:文件特征信息;用于管理和操作控制;文件體;是文件的實際內容信息。文件目錄及

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論