⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_22097.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:22097 发表者:斌 发表日期:2002-11-22 14:40:17
<br>主题:请问:怎样实现父子进程的通讯?
<br>内容:我用createpocess函数创建两个进程,怎么实现他们之间的通讯?<BR>急救!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-11-22 14:43:36
<br>内容:用命名管道最好!<BR>也可以使用socket;<BR>还有内存映射啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:斌 回复日期:2002-11-22 14:54:13
<br>内容:对不起,我对命名管道不太理解<BR>你能否简单说明一下
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:CDMA2000 回复日期:2002-11-22 14:59:25
<br>内容:VC++中利用管道和线程实现进程间通信<BR> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows 95作为一个多任务操作系统,其重要特征之一是引入了多进程和多线程机制 。其中每个进程都有私有的虚拟地址空间,可以创建多个线程,每个线程被分配一个时间片 ,当前执行的线程在其时间片耗尽时挂起,让其他线程运行。由于各时间片很小,所以看起 来就像是多个线程在同时工作。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有时用户运行的进程之间毫无关系,但是进程之间信息的交换则能产生协作效果,这样 就可以完成某些单个进程所不能完成的任务。Windows 95可以使用多种通信手段,包括剪贴 板、DDE、OLE等,而且还增加了一些新的手段,其中管道是用来在不同程序之间交换信息的 简便的通信机制。与其它手段不同,管道没有正式的标准或协议来控制信息传递,所以与DD E会话这样的机制相比,管道更易于使用、更加灵活。管道实际上是一段共享内存区,进程 把共享消息放在这里。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本文将在VC++4.1环境下介绍一个父进程和其子进程的通信实例。在父进程Parent窗 口中按一下鼠标左键,就会产生一个管道(Pipe)并启动子进程Child,且从(Pipe)一端发送 信息,同时Child启动后会创建一个工作线程,专门用来从管道的另一端读入数据。父进程 通过菜单项的控制来改变图形形状参数,并传给Child使之在自己的窗口中绘出响应的图形 。下面分别就父进程Parent和子进程Child来进行说明。 <BR><BR>父进程Parent <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在父进程Parent中,我们将创建管道和启动子进程。首先说明几个相关函数。 <BR><BR>创建进程函数: <BR><BR>BOOL CreateProcess( <BR><BR>LPCTSTR lpApplicationName, //应用模式指针 <BR><BR>LPTSTR lpCommandLine, // 命令行字符串 <BR><BR>LPSECURITY_ATTRIBUTES lpProcessAttributes, <BR><BR>// 进程安全性指针 <BR><BR>LPSECURITY_ATTRIBUTES lpThreadAttributes, <BR><BR>// 主线程安全性指针 <BR><BR>BOOL bInheritHandles,// 是否继承句柄 <BR><BR>DWORD dwCreationFlags,// 进程类型与优先级 <BR><BR>LPVOID lpEnvironment,// 环境块指针 <BR><BR>LPCTSTR lpCurrentDirectory,// 当前目录 <BR><BR>LPSTARTUPINFO lpStartupInfo, <BR><BR>// STARTUPINFO结构指针 <BR><BR>LPPROCESS_INFORMATION lpProcessInformation); <BR><BR>// 新进程信息 <BR><BR>创建管道函数: <BR><BR>BOOL CreatePipe( <BR><BR>PHANDLE hReadPipe, // 读句柄变量地址 <BR><BR>PHANDLE hWritePipe,// 写句柄变量地址 <BR><BR>LPSECURITY_ATTRIBUTES lpPipeAttributes, <BR><BR>// 安全属性指针 <BR><BR>DWORDnSize );//管道缓冲区大小 <BR><BR>写管道函数: <BR><BR>BOOL WriteFile( <BR><BR>HANDLE hFile;//写入文件句柄 <BR><BR>LPCVOID lpBuffer;//写入数据指针 <BR><BR>DWORD nNumberOfBytesToWrite; <BR><BR>//要写入字节数量 <BR><BR>LPDWORD lpNumberOfBytesWritten; <BR><BR>//已写入字节数地址 <BR><BR>LPOVERLAPPED lpOverlapped ); <BR><BR>//异步I/O结构指针 <BR><BR>下面从编程角度讨论其实现步骤: <BR><BR>1.利用AppWizard(EXE)产生Parent应用框架,然后在文件Parentview.cpp头部加入#in clude<global.h>,其中文件global.h定义了两个进程用于相互通信的结构和常量值。代码 如下: <BR><BR>Global.h 共享变量头文件: <BR><BR>typedef struct Figure <BR><BR>{int iShape;// 图形控制参数 <BR><BR>} FIGURE,*PFIGURE; <BR><BR>#define ID_RECT 32771 <BR><BR>#define ID_ELLIPSE 32772 <BR><BR>#define ID_TERMINATE 32773 <BR><BR>2.使用ClassWizard工具:选择对应于CParentView类的消息WM_LBUTTONDOWN,选择AddFu nction键,增加函数OnLButtonDown()。在主菜单资源中加入Rect、Ellipse、Terminate菜 单项,ID分别为IDC_RECT、IDR_ELLIPSE、IDR_TERMINATE,并在ClassWizard中加入相应函 数。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在文件Parentview.h中加入如下代码: <BR><BR>public: <BR><BR>BOOL SendCommand();//发送信息 <BR><BR>HANDLE hProcess; //进程句柄 <BR><BR>HANDLE hpipeWrite; //管道写句柄 <BR><BR>FIGURE figure; <BR><BR>本文给出Parentview.cpp的部分程序代码。 <BR><BR>编者注:源代码发表在:http://www.computerworld.com. cn/98/skill/default. htm。 <BR><BR>子进程Child <BR>Child启动之后,立刻创建一个新的线程,并在新线程中执行读管道操作,利用读得的 参数使主窗口绘出形状。读管道函数为: <BR><BR>BOOL ReadFile( <BR><BR>HANDLE hFile,// 读入文件句柄 <BR><BR>LPVOID lpBuffer, // 读入数据缓冲区地址 <BR><BR>DWORD nNumberOfBytesToRead; <BR><BR>// 要读入字节数量 <BR><BR>LPDWORD lpNumberOfBytesRead,; <BR><BR>// 已读入字节数地址 <BR><BR>LPOVERLAPPED lpOverlapped ); <BR><BR>// 异步I/O结构指针 <BR><BR>首先,从MFC类库中创建新线程,使用ClassWizard工具:选择AddClassNew,输入类名CT hr,在基类列表框中选择“CWinThread",按下Create按钮,生成线程类CThr。然后修改程序 代码。本文给出部分源程序。 <BR><BR>结论 <BR>运行本文例程,在父进程Parent窗口中按一下鼠标左键,就会产生一个Pipe并启动子进 程Child;在Parent中选中菜单项Rect或Ellipse时,Child窗口中就会分别绘出矩形和椭圆 ;选中Terminate时,就会中断通信。以上介绍的是匿名管道,若要增加通信的灵活性还可 采用命名管道NamedPipe,读者可尝试实现。 <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:斌 回复日期:2002-11-22 15:08:07
<br>内容:非常感谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -