第2章 進程管理及處理機調(diào)度_第1頁
第2章 進程管理及處理機調(diào)度_第2頁
第2章 進程管理及處理機調(diào)度_第3頁
第2章 進程管理及處理機調(diào)度_第4頁
第2章 進程管理及處理機調(diào)度_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第2章 進程管理與處理機調(diào)度實驗一:Windows基本進程管理一、實驗?zāi)康耐ㄟ^觀察Widnows操作系統(tǒng)中實際進程的動態(tài)信息,進一步加深進程的概念的理解。二、實驗內(nèi)容通過觀察任務(wù)管理器,來觀察各個進程的動態(tài)信息。三、預(yù)備知識 任務(wù)管理器:了解用戶計算機上正在運行的程序和進程的相關(guān)信息。 Windows環(huán)境中的編程。四、基本實驗1.觀察任務(wù)管理器步驟一:進入Windows XP系統(tǒng)。步驟二:按Ctrl+Alt+Del(或按Ctrl+Shift_Esc)鍵都可以調(diào)出任務(wù)管理器。步驟三:單擊“查看”“選擇列”選項,可以看到一些選項,如圖2.1所示.這里,可以查看每個進程的PID、CPU使用時間,內(nèi)存

2、的使用情況,當(dāng)前的進程是系統(tǒng)的還是用戶的,每個句柄的數(shù)量,每個進程的優(yōu)先級等信息。步驟四:單擊“性能”標簽,在2.2所示的“性能”選項卡中可以看到CPU的使用情況、內(nèi)存的使用情況。圖2.1 圖2.22.通過命令觀察進程情況步驟一:單擊“開始”“運行”選項,輸入cmd,進入“命令提示符”下。步驟二:輸入tasklist后結(jié)果如圖2.3所示。圖2.3步驟三:繼續(xù)輸入tasklist/?來尋找?guī)椭?,里面有更詳細的解釋?.通過命令來關(guān)閉一個進程步驟一:單擊“開始”“運行”選項,輸入cmd,進入“命令提示符”下。步驟二:輸入tasklist后回車執(zhí)行。步驟三:繼續(xù)輸入taskkill /PID 284

3、 /T,結(jié)果如圖2.4所示。圖2.4五、實驗編程進行一個簡單的Windows的圖形用戶接口(GUI)編程。步驟一:進入Windows XP系統(tǒng)。步驟二:進入Microsoft Visual Studio 2008.步驟三:在菜單欄中單擊“文件”“新建”“文件”C+ Source File,選擇路徑(c:test.cpp),并命名為test.cpp(注意擴展名)。步驟四:將下面的程序源代碼輸入。步驟五:單擊Windows系統(tǒng)的“開始”“Microsoft Visual Studio 2008” “Visual studio tools” “Visual Studio 2008 命令提示”選項,打

4、開命令行窗口步驟六:依次輸入命令為CL d:test.cpp步驟七:若沒有錯誤,則會自動生成test.exe和test.obj文件,輸入“test.exe”,即可看到結(jié)果。程序源代碼如下:# include#include/告訴連接器與包括MessageBox API函數(shù)的user32庫進行連接#pragma comment(lib,user32.lib)int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow):MessageBox(NULL,hello w

5、indows XP,提示信息,MB_OK);return 0;六、自學(xué)內(nèi)容1、任務(wù)管理器2、Windows環(huán)境下編程實驗二:進程控制實踐一、實驗?zāi)康呐浜喜僮飨到y(tǒng)課程的學(xué)習(xí),加深對進程的控制與描述的理解并熟悉C#中進程函數(shù)的使用。二、實驗內(nèi)容使用System.Diagnostics命名空間提供進程訪問方法,控制進程。如創(chuàng)建一個進程,結(jié)束一個進程,獲取進程信息,如ID號。三、預(yù)備知識在.NET平臺發(fā)布之前,進程的概念已經(jīng)在Windows操作系統(tǒng)中存在很久了。對于每一個被加載到內(nèi)存的*.exe,在它的生命周期中操作系統(tǒng)會為之創(chuàng)建一個單獨且安全的進程?,F(xiàn)在每一個Windows進程都有一個唯一的進程標識

6、符(PID),當(dāng)需要時,它們能被操作系統(tǒng)加載或卸載。.NET平臺直與進程進行交互的方式改變了很多,早前人們多使用MFC與進程交互。而在.NET平臺下,System.Diagnostics命名空間定義了許多類型,它們允許人們以編程方式訪問進程和許多與診斷(Diagnostics)相關(guān)的類型。具體內(nèi)容見表2.1 System.Diagnostics命名空間中的部分成員。表2.1 System.Diagnostics命名空間中的部分成員System.Diagnostics命名空間中進程相關(guān)的類作 用Process提供了訪問本地和遠程進程的功能,允許通過編程方式開始或結(jié)束進程ProcessModule

7、代表一個加載到特定進程的模塊(*.dll或*.exe)。它能夠表示任何模塊基于COM、基于.NET或基于傳統(tǒng)C的二進制程序ProcessModuleCollection提供ProcessModule對象的強類型集合ProcessStartInfo指定通過Process.Start( )方法啟動進程時使用的一組值ProcessThread代表指定進程中的線程。它用于診斷一個進程的線程情況,并不用于在進程中創(chuàng)建線程ProcessThreadColloection提供ProcessThread對象的強類型集合System.Diagnostics.Process類用于分析運行于(本地或遠程的)機器上的

8、進程。Process類也提供了很多成員,可用來編程控制進程,如創(chuàng)建,結(jié)束,以及獲得進程中活動純種的列表等。表2.2顯示了System.Diagnostics.Process的部分關(guān)鍵成員。表2.2 Process類的部分成員成員作 用ExitTime獲取終止進程相關(guān)的時間戳(類型是DateTime)Handle返回操作系統(tǒng)分配進程的句柄(由IntPtr表示)。當(dāng)構(gòu)建與非托管代碼交互的.NET程序時,該屬性很有用Id獲取關(guān)聯(lián)進程的PIDMachineName獲取關(guān)聯(lián)進程運行的計算機名稱MainWindowTitle獲取進程主窗口的標題(如果進程沒有主窗口,則返回空字符串)Modules可以訪問強

9、類型ProcessModuleCollection,后者表示一組加載到當(dāng)前進程的模塊ProcessName獲取進程的名稱(也就是應(yīng)用程序本身的名稱)Responding指示進程的用戶界面是否響應(yīng)用戶輸入(或者當(dāng)前是否被“掛起”)StartTime獲取關(guān)聯(lián)進程開始聽時間Threads獲取運行在關(guān)聯(lián)進程中的一組線程的設(shè)置除了上面的屬性之外,System.Diagnostics.Process還定義了一些有用的方法(見表2.3)。表2.3 Process類的部分成員成員作 用CloseMainWindow( )通過向進程的主窗口發(fā)送關(guān)閉消息來關(guān)閉擁有用戶界面的進程GetCurrentProcess(

10、 )這個靜態(tài)方法返回新的Process對象以表示當(dāng)前活動的進程Getprocesses( )這個靜態(tài)方法返回運行在給定計算機上的新Process對象Kill( )立即停止關(guān)聯(lián)的進程Start( )啟動一個進程4、 實驗編程 設(shè)計對話框窗口,模擬Windows操作系統(tǒng)的任務(wù)管理器中進程簡單管理功能。 步驟:啟動Visual Studio2008,打開菜單“文件”“新建”“項目”,彈出如圖2.5所示對話框。圖2.5 新建項目對話框項目類型選擇Visual C#,模板選擇Windows窗體應(yīng)用程序,輸入名稱如WinFormProcess,輸入項目保存的位置,其他項目默認即可,點擊“確定”。步驟二:在

11、窗口中設(shè)計對話框。首先,在左側(cè)的工具箱中的“公共控件”中選擇ListView控件,拖放到窗口中,調(diào)整好位置(如圖2.6所示),并對該控件命名(選擇中該ListView控件后,單擊右鍵選擇“屬性”),在屬性對話框中選擇(Name),將其值改為listViewProcess。再向窗口中拖放四個Button控件,調(diào)整位置(如圖2.6所示),對四個Button控件命名和修改Text屬性內(nèi)容,命名Text屬性值見表2.4。表2.4 Button按鈕命名及Text屬性表Button命名Text屬性值btnCreateProcess創(chuàng)建進程btnGetAllProcess獲取進程btnKillProcess

12、s殺死進程btnExit退出圖2.6 程序窗口設(shè)計圖步驟三:打開代碼編輯窗口,在引用部分輸入以下內(nèi)容using System.Diagnostics;步驟四:雙擊每個Button控件,添加事件響應(yīng)程序1.創(chuàng)建進程private void btnCreateProcess_Click(object sender, EventArgs e) Process cmdProc = null; try cmdProc=Process.Start(cmd.exe); catch(InvalidOperationException ex) MessageBox.Show(this,ex.Message);

13、2.獲取進程private void GetAllRunningProccesses() listViewProcess.View = View.Details; listViewProcess.FullRowSelect = true; var runningProcs = from proc in Process.GetProcesses(.) orderby proc.Id select proc; listViewProcess.Clear(); int i = 0; ListViewItem listViewItems = new istViewItemrunningProcs.Co

14、unt(); foreach (var p in runningProcs) ListViewItem item = new ListViewItem(i + 1).ToString(), i); item.SubItems.Add(p.Id.ToString(); item.SubItems.Add(p.ProcessName); listViewItemsi = item; i+; listViewProcess.Items.AddRange(listViewItems); listViewProcess.Columns.Add(SequenceCode); listViewProcess

15、.Columns.Add(ProcessId); listViewProcess.Columns.Add(ProcessName); private void btnGetProcess_Click(object sender, EventArgs e) GetAllRunningProccesses(); 3.殺死進程private void btnKillProcess_Click(object sender, EventArgs e) if (listViewProcess.SelectedItems.Count 1) return; int selectedProcessId =Con

16、vert.ToInt32(listViewProcess.SelectedItems0.SubItems1.Text); Process selectedProc = Process.GetProcessById(selectedProcessId); if (!selectedProc.HasExited) selectedProc.Kill(); MessageBox.Show(this, ProcessId= + selectedProcessId + has been killed.); GetAllRunningProccesses();4.退出private void btnExi

17、t_Click(object sender, EventArgs e) this.Close();步驟五、運行程序點擊菜單“調(diào)試”“啟動調(diào)試”,點擊“獲取進程”,如圖2.7所示圖2.7 進程管理程序?qū)υ捒蛭?、自學(xué)內(nèi)容1、學(xué)習(xí)MFC,使用Win32API管理進程。2、學(xué)習(xí)在托管環(huán)境中完成與非托管理程序的互操作,典型問題如鉤子程序。實驗三:經(jīng)典同步問題實踐一、 實驗?zāi)康呐浜喜僮飨到y(tǒng)課程的學(xué)習(xí),掌握進程同步和互斥算法,理解信號量機制,加深對各類經(jīng)典問題的理解并熟悉VS2008工具的使用。二、實驗內(nèi)容1. 利用信號量機制完成生產(chǎn)者消費者問題2. 利用信號量機制完成讀者寫者問題3. 利用信號量機制完成哲

18、學(xué)家就餐問題三、預(yù)備知識在.net的System.Threading 命名空間提供一些使得可以進行多線程編程的類和接口。其中包括同步線程活動和訪問數(shù)據(jù)的類如Mutex、Semaphore、Monitor、Interlocked、AutoResetEvent 等。一些主要類和作用如表2.5所示。表2.5 System.Diagnostics命名空間中的部分成員System.Threading命名空間中進程相關(guān)的類作 用Thread創(chuàng)建并控制線程,設(shè)置其優(yōu)先級并獲取其狀態(tài)。Mutex 一個同步基元,也可用于進程間同步。Semaphore限制可同時訪問某一資源或資源池的線程數(shù)。四、實驗編程(一)生產(chǎn)

19、者消費者問題實踐步驟:啟動Visual Studio2008,打開菜單“文件”“新建”“項目”,彈出如圖2.8所示對話框。模板選擇“控制臺應(yīng)用程序”,并輸入名稱,如“ProducerAndCustomer”圖2.8 創(chuàng)建生產(chǎn)者消費者控制臺應(yīng)用程序?qū)υ捒虿襟E二:在代碼編輯窗口添加System.Threadin命名空間。步驟三:在代碼編輯窗口,編寫生產(chǎn)者消費者程序。1.定義信號量 private static Mutex mut = new Mutex(); private static Semaphore empty = new Semaphore(5, 5);/空閑緩沖區(qū) private st

20、atic Semaphore full = new Semaphore(0, 5);2.生產(chǎn)者private static void Producer() Console.WriteLine(0已經(jīng)啟動, Thread.CurrentThread.Name); empty.WaitOne();/對empty進行Wait操作 mut.WaitOne();/對mut進行Wait操作 Console.WriteLine(0放入數(shù)據(jù)到臨界區(qū), Thread.CurrentThread.Name); Thread.Sleep(1000); mut.ReleaseMutex();/對mut進行Signal

21、操作 full.Release();/對full進行Signal操作3.消費者private static void Customer() Console.WriteLine(0已經(jīng)啟動, Thread.CurrentThread.Name); Thread.Sleep(12000); full.WaitOne();/對full進行Wait操作 mut.WaitOne();/對mut進行Wait操作 Console.WriteLine(0讀取臨界區(qū), Thread.CurrentThread.Name); mut.ReleaseMutex();/對mut進行Signal操作 empty.Rel

22、ease();/對empty進行Signal操作4.生產(chǎn)者消費者模擬static void Main() Console.WriteLine(生產(chǎn)者消費者模擬.); for (int i = 1; i 9; i+) Thread Thread1 = new Thread(new ThreadStart(Producer); Thread Thread2 = new Thread(new ThreadStart(Customer); Thread1.Name = String.Format(生產(chǎn)者線程0, i); Thread2.Name = String.Format(消費者線程0, i);

23、Thread1.Start(); Thread2.Start(); Console.ReadKey();步驟四、運行程序點擊菜單“調(diào)試”“啟動調(diào)試”,運行結(jié)果如圖2.9所示(每次運行結(jié)果可能不同)。圖2.9 生產(chǎn)者消費者模擬程序運行圖(二)讀者寫者問題實踐 具體步驟(略)1.信號量定義private static Mutex mut = new Mutex();/用于保護讀者數(shù)量的互斥信號量private static Mutex rw = new Mutex();/保證讀者寫者互斥的信號量static int count = 0;/讀者數(shù)量2.讀者private static void Re

24、ader() mut.WaitOne(); if (count = 0) rw.WaitOne(); count+; mut.ReleaseMutex(); Thread.Sleep(new Random().Next(2000);/讀取耗時1S Console.WriteLine(讀取完畢); mut.WaitOne(); count-; mut.ReleaseMutex(); if (count = 0) rw.ReleaseMutex();3.寫者private static void writer() rw.WaitOne(); Console.WriteLine(寫入數(shù)據(jù)); rw.

25、ReleaseMutex();4.讀者寫者模擬static void Main() Console.WriteLine(讀者寫者模擬.); for (int i = 1; i 6; i+) Thread Thread1 = new Thread(new ThreadStart(Reader); Thread1.Name = String.Format(讀者線程0, i); Thread1.Start(); Thread Thread2 = new Thread(new ThreadStart(writer); Thread2.Name = String.Format(寫者線程); Thread

26、2.Start(); Console.ReadKey();(三)哲學(xué)家就餐問題具體步驟(略)private static int chopstick = new int5;/分別代表哲學(xué)家的5只筷子private static Mutex eat = new Mutex();/用于保證哲學(xué)家同時拿起兩雙筷子static void Main() /初始設(shè)置所有筷子可用 for (int k = 1; k = 5; k+) chopstickk - 1 = 1; /每個哲學(xué)家輪流進餐一次 for (int i = 1; i = 5; i+) Thread Thread1 = new Thread(

27、new ThreadStart(Philosophers); Thread1.Name = i.ToString(); Thread1.Start(); Console.ReadKey();private static void Philosophers() /如果筷子不可用,則等待2秒 while (chopstickint.Parse(Thread.CurrentThread.Name) - 1 != 1 | chopstick(int.Parse(Thread.CurrentThread.Name) % 4 != 1) Console.WriteLine(哲學(xué)家0正在等待, Thread

28、.CurrentThread.Name); Thread.Sleep(2000); eat.WaitOne(); /同時拿起兩雙筷子 chopstickint.Parse(Thread.CurrentThread.Name) - 1 = 0; chopstick(int.Parse(Thread.CurrentThread.Name) % 4 = 0; eat.ReleaseMutex(); Thread.Sleep(1000); Console.WriteLine(哲學(xué)家0正在用餐., Thread.CurrentThread.Name); /用餐完畢后放下筷子 chopstickint.P

29、arse(Thread.CurrentThread.Name) - 1 = 1; chopstick(int.Parse(Thread.CurrentThread.Name) % 4 = 1; Console.WriteLine(哲學(xué)家0用餐完畢,繼續(xù)思考, Thread.CurrentThread.Name);五、自學(xué)內(nèi)容1、學(xué)習(xí)C#中其他的進程同步手段。2、學(xué)習(xí)在MFC中利用Win32API模擬經(jīng)典同步問題。3、了解C#中的委托功能。實驗四:進程間通信機制實踐一、實驗?zāi)康呐浜喜僮飨到y(tǒng)課程的學(xué)習(xí),通過對消息傳遞,共享內(nèi)存,管道通信三種進程間通信機制的實現(xiàn),加深對進程間通信機制的理解并熟練使用

30、C#進行程序設(shè)計。二、實驗內(nèi)容模擬客戶端和服務(wù)器端的進程間通信。分別采用不同的機制實現(xiàn)。(1)在客戶端使用SendMessage函數(shù)發(fā)送信息到服務(wù)器端實現(xiàn)進程間通信;(2)在客戶端使用內(nèi)存映像機制發(fā)送消息到服務(wù)器端實現(xiàn)進程間通信;(3)使用MFC提供的CreateNamedPipe函數(shù)來創(chuàng)建管道,ConnectNamedPipe函數(shù)來連接已創(chuàng)建的管道,ReadFile函數(shù)來讀取文件數(shù)據(jù),CreateFileMapping為文件創(chuàng)建映射。三、預(yù)備知識(1)消息傳遞機制是實現(xiàn)進程通信的一種方法。發(fā)送進程在發(fā)送消息之前,先在自己的內(nèi)存空間設(shè)置一個發(fā)送區(qū),把欲發(fā)送的消息填入其中,然后再用發(fā)送過程將其發(fā)

31、送出去。接收進程則在接收消息之前,在自己的內(nèi)存空間內(nèi)設(shè)置相應(yīng)的接收區(qū),然后用接收進程接收消息。發(fā)送進程向消息緩沖區(qū)寫消息,而不用管接收進程是否已經(jīng)準備好要接收。接收進程則從消息緩沖區(qū)內(nèi)讀消息。(2)操作系統(tǒng)通過申請一塊內(nèi)在來實現(xiàn)進程間通信的方式被稱為共享內(nèi)存的進程通信機制,這種方式的好處是:通過把數(shù)據(jù)放在進程都可以看到的內(nèi)存空間,從而避免了數(shù)據(jù)復(fù)制帶來的開銷;但是也存在問題:由于進程共享內(nèi)存,就要考慮到進程間的互斥問題。Win32 API中共享內(nèi)存實際就是文件映射的一種特殊情況。進程在創(chuàng)建文件映射對象時用0xFFFFFFFF來代替文件句柄,就表示了對應(yīng)的文件映射對象是從操作系統(tǒng)頁面文件訪問內(nèi)存

32、,其他進程打開該文件映射對象就可以訪問該內(nèi)存塊。由于共享內(nèi)存是用文件映射實現(xiàn)的,所以它也有較好的安全性,但也只能運行于同一計算機上的進程之間。(3)管道通信是進程間通信的又一種機制。管道是連接讀寫進程的一個特殊文件,允許進程按先進先出的方式傳送數(shù)據(jù),也能使用進程同步執(zhí)行操作。發(fā)送進程以字符流形式把大量數(shù)據(jù)送入管道,接收進程從管道中接收數(shù)據(jù)。管道實質(zhì)是一個共享文件,基本上可借助于文件系統(tǒng)的機制實現(xiàn),包括文件的創(chuàng)建、打開、關(guān)閉和讀寫等。要想在客戶端和服務(wù)器端進行通信,首先必須為兩者之間建立管道,并且只有將客戶端和服務(wù)器端的管道連接上才能進行通信。(4)若要在C#中調(diào)用Win32 API首先要在程序

33、中引入System.Runtime.InteropServices命名空間。進程間通信主要使用user32.dll和Kernel32.dll中的函數(shù),具體的函數(shù)名稱及含義見表2.6和表2.7。表2.6 user32.dll中部分函數(shù)及含義函數(shù)名稱含 義SendMessage( )該函數(shù)將指定的消息發(fā)送到一個或多個窗口。此函數(shù)為指定的窗口調(diào)用窗口程序,直到窗口程序處理完消息再返回。FindWindow( )從類名或窗口中返回一個相匹配的頂層窗口的句柄表2.7 Kernel32.dll中部分函數(shù)及含義函數(shù)名稱含 義CreateFileMapping( )該函數(shù)創(chuàng)建一個文件映射內(nèi)核對象,通過參數(shù)hF

34、ile指定待映射到進程地址空間的文件句柄。MapViewOfFile( )該函數(shù)負責(zé)把文件數(shù)據(jù)映射到進程的地址空間,參數(shù)hFileMappingObject為CreateFileMapping()返回的文件映像對象句柄。UnmapViewOfFile( )唯一的參數(shù)lpBaseAddress指定了返回區(qū)域的基地址,必須將其設(shè)定為MapViewOfFile()的返回值。在使用了函數(shù)MapViewOfFile()之后,必須要有對應(yīng)的UnmapViewOfFile()調(diào)用,否則在進程終止之前,保留的區(qū)域?qū)o法釋放。CloseHandle( )該函數(shù)將由CreateFileMapping()函數(shù)創(chuàng)建的

35、文件內(nèi)核對象和文件映射內(nèi)核對象在進程終止之前將其釋放,否則將會出現(xiàn)資源泄漏的問題。GetLastError( )該函數(shù)的作用就是取得上一個函數(shù)操作時所產(chǎn)生的錯誤代碼四、實驗編程(一)消息傳遞實現(xiàn)進程間通信設(shè)計對話框窗口,模擬客戶端發(fā)送消息操作。 步驟:啟動Visual Studio2008,打開菜單“文件”“新建”“項目”,彈出如圖2.10 所示對話框。圖2.10 新建項目對話框項目類型選擇Visual C#,模板選擇Windows窗體應(yīng)用程序,輸入名稱如SendMessage,輸入項目保存的位置,其他項目默認即可,點擊“確定”。步驟二:在窗口中設(shè)計對話框。首先,在左側(cè)的工具箱中的“公共控件”

36、中選擇TextBox控件,拖放到窗口中,調(diào)整好位置(如圖2.11所示),并對該控件命名(選擇中該ListView控件后,單擊右鍵選擇“屬性”),在屬性對話框中選擇(Name),將其值改為txtEditBox。再向窗口中拖放2個Button控件,調(diào)整位置(如圖2.11所示),對2個Button控件命名和修改Text屬性內(nèi)容,命名Text屬性值見表2.8。表2.8 Button按鈕命名及Text屬性表Button命名Text屬性值btnSendmessageSend MessagebtnOKOK圖2.11 程序窗口設(shè)計圖步驟三:打開代碼編輯窗口,在引用部分輸入以下內(nèi)容using System.Ru

37、ntime.InteropServices;具體代碼如下:using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.Runtime.InteropServices;namespace SendMessage1 public partial class ClientForm : Form const int WM_COPYDATA = 0x004A;DllImport

38、(User32.dll, EntryPoint = SendMessage) private static extern int SendMessage( int hWnd, / handle to destination window int Msg, / message int wParam, / first message parameter ref COPYDATASTRUCT lParam / second message parameter ); DllImport(User32.dll, EntryPoint = FindWindow) private static extern

39、 int FindWindow(string lpClassName, string lpWindowName); public struct COPYDATASTRUCT public IntPtr dwData; public int cbData; MarshalAs(UnmanagedType.LPStr) public string lpData; public ClientForm() InitializeComponent(); private void btnSendMessage_Click(object sender, EventArgs e) int WINDOW_HAN

40、DLER = FindWindow(null, Server); if(WINDOW_HANDLER = 0) MessageBox.Show(Could not find server.); else byte sarr = System.Text.Encoding.Default.GetBytes(this.txtEdit.Text); int len = sarr.Length; COPYDATASTRUCT cds; cds.dwData = (IntPtr) 100; cds.lpData = this.txtEdit.Text; cds.cbData = len + 1; Send

41、Message(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds); private void btnOK_Click(object sender, EventArgs e) this.Close(); 同以上步驟設(shè)計模板服務(wù)器端窗口程序,具體步驟略,詳細代碼如下:using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.Runtime

42、.InteropServices;namespace RecieveMessage1 public partial class ServerForm : Form const int WM_COPYDATA = 0x004A; public ServerForm() InitializeComponent(); private void btnOK_Click(object sender, EventArgs e) this.Close(); protected override void DefWndProc(ref System.Windows.Forms.Message m) switc

43、h(m.Msg) case WM_COPYDATA: COPYDATASTRUCT mystr = new COPYDATASTRUCT(); Type mytype = mystr.GetType(); mystr =(COPYDATASTRUCT)m.GetLParam(mytype); this.txtText.Text =mystr.lpData; break; default: base.DefWndProc(ref m); break; public struct COPYDATASTRUCT public IntPtr dwData; public int cbData; Mar

44、shalAs(UnmanagedType.LPStr) public string lpData; (二)共享內(nèi)存實現(xiàn)進程間通信設(shè)計對話框窗口,模擬客戶端發(fā)送消息操作。 步驟:啟動Visual Studio2008,打開菜單“文件”“新建”“項目”,彈出如圖2.12 所示對話框。圖2.12 新建項目對話框項目類型選擇Visual C#,模板選擇Windows窗體應(yīng)用程序,輸入名稱如SendMessage,輸入項目保存的位置,其他項目默認即可,點擊“確定”。步驟二:在窗口中設(shè)計客戶端對話框。首先,在左側(cè)的工具箱中的“公共控件”中選擇TextBox控件,拖放到窗口中,調(diào)整好位置(如圖2.11所示)

45、,并對該控件命名(選擇中該TextBox控件后,單擊右鍵選擇“屬性”),在屬性對話框中選擇(Name),將其值改為txtEditBox。再向窗口中拖放2個Button控件,調(diào)整位置(如圖2.11所示),對2個Button控件命名和修改Text屬性內(nèi)容,命名Text屬性值見表2.8。表2.8 Button按鈕命名及Text屬性表Button命名Text屬性值btnSendmessageSendMessageToSharedMemorybtnOpenServerOpenServerForm圖2.12 模擬客戶端程序窗口設(shè)計圖步驟三:在窗口中設(shè)計服務(wù)端對話框,如圖2.13所示。首先,在左側(cè)的工具箱中

46、的“公共控件”中選擇TextBox控件,拖放到窗口中,調(diào)整好位置(如圖2.13所示),并對該控件命名(選擇中該TextBox控件后,單擊右鍵選擇“屬性”),在屬性對話框中選擇(Name),將其值改為txtViewBox。再向窗口中拖放2個Button控件,調(diào)整位置(如圖2.13所示),對2個Button控件命名和修改Text屬性內(nèi)容,命名Text屬性值見表2.9。表2.9 Button按鈕命名及Text屬性表Button命名Text屬性值btnOpenOpenSharedMemorybtnExitExit System圖2.13 模擬服務(wù)端程序窗口設(shè)計圖步驟四:右鍵解決方案“Send Mess

47、age”,如圖2.14所示圖2.14 添加類ShareMem操作圖1 在彈出的對話中,輸入類名“ShareMem.cs”,如圖2.15所示圖2.15 添加類ShareMem操作圖2ShareMem類具體代碼如下using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace SendMessage2 public class ShareMem DllImport(user32.dll, CharSet = CharSet.Auto) pub

48、lic static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam); DllImport(Kernel32.dll, CharSet = CharSet.Auto) public static extern IntPtr CreateFileMapping(int hFile, IntPtr lpAttributes, uint flProtect, uint dwMaxSizeHi, uint dwMaxSizeLow, string lpName); DllImport(Kernel32.dll, CharSet = CharSet.Aut

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論