VC++中利用管道和线程实现进程间通信_第1页
VC++中利用管道和线程实现进程间通信_第2页
VC++中利用管道和线程实现进程间通信_第3页
VC++中利用管道和线程实现进程间通信_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VC+中利用管道和线程实现进程间通信Windows95 作为一个多任务操作系统,具重要特征之一是引入了多进程和多线程机制。其中每个进程都有私有的虚拟地址空间,可以创建多个线程,每个线程被分配一个时间片,当前执行的线程在其时间片耗尽时挂起,让其他线程运行。由于各时间片很小,所以看起来就像是多个线程在同时工作。有时用户运行的进程之间毫无关系,但是进程之间信息的交换则能产生协作效果,这样就可以完成某些单个进程所不能完成的任务。Windows95 可以使用多种通信手段,包括剪贴板、DDEOLE,而且还增加了一些新的手段,其中管道是用来在不同程序之间交换信息的简便的通信机制。与其它手段不同,管道没有正式

2、的标准或协议来控制信息传递,所以与 DDE 会话这样的机制相比,管道更易于使用、更加灵活。管道实际上是一段共享内存区,进程把共享消息放在这里。本文将在 va+4.1 环境下介绍一个父进程和其子进程的通信实例。 在父进程 Parent窗口中按一下鼠标左键,就会产生一个管道(Pipe)并启动子进程 Child,且从(Pipe)一端发送信息,同时 Child 启动后会创建一个工作线程,专门用来从管道的另一端读入数据。父进程通过菜单项的控制来改变图形形状参数, 并传给 Child使之在自己的窗口中绘出响应的图形。下面分别就父进程 Parent 和子进程 Child 来进行说明。父进程 Parent在父

3、进程 Parent 中,我们将创建管道和启动子进程。首先说明几个相关函数。创建进程函数:BOOLCreateProcess(LPCTSTRlpApplicationName,/应用模式指针LPTSTRlpCommandLine,/命令行字符串LPSECURITY_ATTRIBUTESlpProcessAttributes,/进程安全性指针LPSECURITY_ATTRIBUTESlpThreadAttributes,/主线程安全性指针BOOLbInheritHandles,/是否继承句柄DWORDdwCreationFlags,/进程类型与优先级LPVOIDIpEnvironment,/环境块

4、指针LPCTSTRlpCurrentDirectory,/当前目录LPSTARTUPINFOlpStartupInfo,/STARTUPINFO 结构指针LPPROCESS_INFORMATIONlpProcessInformation);/新进程信息创建管道函数:BOOLCreatePipe(PHANDLEhReadPipe,/读句柄变量地址PHANDLEhWritePipe,/写句柄变量地址LPSECURITY_ATTRIBUTESlpPipeAttributes,/安全属性指针DWORDnSize);/管道缓冲区大小写管道函数:BOOLWriteFile(HANDLEhFile;/写入文

5、件句柄LPCVOIDlpBuffer;/写入数据指针DWORDnNumberOfBytesToWrite/要写入字节数量LPDWORDlpNumberOfBytesWritten/已写入字节数地址LPOVERLAPPEDIpOverlapped);/异步 I/O 结构指针下面从编程角度讨论其实现步骤:1 .利用 AppWizard(EXE)产生 Parent 应用框架,然后在文件 Parentview.cpp头部加入#include,其中文件 global.h 定义了两个进程用于相互通信的结构和常量值。代码如下:Global.h 共享变量头文件:typedefstructFigureintiS

6、hape;/图形控制参数FIGURE,*PFIGURE;# defineID_RECT32771# defineID_ELLIPSE32772ddefineID_TERMINATE327732 .使用 ClassWizard 工具:选择对应于 CParentView 类的消息 WM_LBUTTONDOWN,选择 AddFunction 键,增加函数 OnLButtonDown()。在主菜单资源中加入 Rect、EllipseTerminate 菜单项,ID分别为IDC_RECTIDR_ELLIPSEIDR_TERMINATE 并在ClassWizard 中加入相应函数。在文件 Parentvi

7、ew.h 中加入如下代码:public:BOOLSendCommand();/发送信息HANDLEhProcess;/进程句柄HANDLEhpipeWrite;/管道写句柄FIGUREfigure;本文给出 Parentview.cpp 的部分程序代码。编者注:源代码发表在:http:/ ChildChild 启动之后,立刻创建一个新的线程,并在新线程中执行读管道操作,利用读得的参数使主窗口绘出形状。读管道函数为:BOOLReadFile(HANDLEhFile,/读入文件句柄LPVOIDlpBuffer,/读入数据缓冲区地址DWORDnNumberOfBytesToRead/要读入字节数量LPDWORDlpNumberOfBytesRead,/已读入字节数地址LPOVERLAPPEDlpOverlapped);/异步 I/O 结构指针首先,从 MF 废库中创建新线程,使用 ClassWizard 工具:选择 AddClassNew,输入类名CThr,在基类列表框中选择“CWinThread,按下 Create 按钮,生成线程类 CThr-o 然后修改程序代码。本文给出部分源程序。结论运行本文例程,在父进程 Parent 窗口中按一下鼠标左键,就会产生一个 Pipe并启动子进程 Child;在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论