資源描述:
《vc++環(huán)境下利用管道與線程實現(xiàn)進程間通信》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、vc++環(huán)境下利用管道和線程實現(xiàn)進程間通信VC++環(huán)境下利用管道和線程實現(xiàn)進程間通信電子部第二十八研究所一部張杰一.引言----Windows95作為一個優(yōu)先多任務操作系統(tǒng),其重要特征之一是引入了多進程和多線程機制。其中每個進程都有私有的虛擬地址空間,可以創(chuàng)建多個線程,每個線程被分配一個時間片,且當前執(zhí)行的線程在其時間片耗盡時掛起,讓其他線程運行。由于各時間片很小,所以這時看起來就象是多個線程在同時工作。我們這里將會在子進程Child中產生一個工作線程,它只在后臺處理任務,而不會影響程序的使用。----有時用戶運行的進程之間毫無關系,但是進程之間信息的交換則能產生協(xié)作效果,這
2、樣就可以完成某些單個進程所不能完成的任務。Windows95可以使用多種通信手段,包括剪貼板、DDE、OLE,而且還增加了一些新的手段,其中管道是用來在不同程序之間交換信息的另一個新的簡便的通信機制。與其它手段不同,管道沒有正式的標準或協(xié)議來控制信息傳遞,所以與DDE會話這樣的機制相比,管道更易于使用、更加靈活。管道實際上是一段共享內存區(qū),進程把共享消息放在那里。因為管道專用于進程間的通信,所以Win32API提供了一組函數(shù)以方便信息交換。----本文我們將在VC++4.1環(huán)境下介紹一個父進程和其子進程的通信實例。在父進程Parent窗口中按一下鼠標左鍵,就會產生一個Pipe
3、和啟動子進程Child,并從Pipe一端發(fā)送信息,同時Child啟動后會創(chuàng)建一個工作線程,專門用來從管道的另一端讀入數(shù)據。通過父進程菜單項的控制來改變圖形形狀參數(shù),并傳給Child使之在自己的窗口中繪出響應的圖形。下面分別就父進程Parent和子進程Child來進行說明。二.父進程Parent----在父進程Parent中,我們將創(chuàng)建管道和啟動子進程。首先說明幾個相關函數(shù)。創(chuàng)建進程函數(shù):BOOLCreateProcess(LPCTSTRlpApplicationName,//應用模式指針LPTSTRlpCommandLine,//命令行字符串LPSECURITY_ATTRIB
4、UTESlpProcessAttributes,//進程安全性指針LPSECURITY_ATTRIBUTESlpThreadAttributes,//主線程安全性指針BOOLbInheritHandles,//是否繼承句柄DWORDdwCreationFlags,//進程類型與優(yōu)先級LPVOIDlpEnvironment,//環(huán)境塊指針LPCTSTRlpCurrentDirectory,//當前目錄LPSTARTUPINFOlpStartupInfo,//STARTUPINFO結構指針LPPROCESS_INFORMATIONlpProcessInformation//);/
5、/新進程信息創(chuàng)建管道函數(shù):BOOLCreatePipe(PHANDLEhReadPipe,//讀句柄變量地址PHANDLEhWritePipe,//寫句柄變量地址LPSECURITY_ATTRIBUTESlpPipeAttributes,//安全屬性指針DWORDnSize);//管道緩沖區(qū)大小寫管道函數(shù):BOOLWriteFile(HANDLEhFile,//寫入文件句柄LPCVOIDlpBuffer,//寫入數(shù)據指針DWORDnNumberOfBytesToWrite,//要寫入字節(jié)數(shù)量LPDWORDlpNumberOfBytesWritten,//已寫入字節(jié)數(shù)地址LPO
6、VERLAPPEDlpOverlapped);//異步I/O結構指針----下面從編程角度討論其實現(xiàn)步驟:----1.利用AppWizard(EXE)產生Parent應用框架,然后再文件Parentview.cpp頭部加入#include,其中文件global.h定義了兩個進程用于相互通信的結構和常量值。代碼如下://////////////////Global.h共享變量頭文件typedefstructFigure{intiShape;//圖形控制參數(shù)}FIGURE,*PFIGURE;#defineID_RECT32771#defineID_ELLIPSE32772#def
7、ineID_TERMINATE32773----2.使用ClassWizard工具:選擇對應于CParentView類的消息WM_LBUTTONDOWN,選擇AddFunction鍵,增加函數(shù)OnLButtonDown()。在主菜單資源中加入Rect、Ellipse、Terminate菜單項,ID分別為IDC_RECT、IDR_ELLIPSE、IDR_TERMINATE,并在ClassWizard中加入相應函數(shù)。在文件Parentview.h中加入如下代碼:public:BOOLSendCommand(