社区
进程/线程/DLL
帖子详情
求教:两个程序之间的通信问题
fanlin00428
2005-07-19 11:21:59
有两个可执行程序:第一个程序每秒产生一个字符串,第二个是一个客户端发送程序。我需要将第一个程序产生的字符串,通过第二个程序实时的发送出去。请问:1.如何把产生的字符串传递个发送程序(每秒产生一个字符串,同时传递给第二个程序)?2.用什么方法比较可行(管道,消息,共享内存,socket...)?3.如何实现,请写出一点简单代码,或提供一点相关信息、网址。
请不吝赐教,高分酬谢,顶者有分!
...全文
300
11
打赏
收藏
求教:两个程序之间的通信问题
有两个可执行程序:第一个程序每秒产生一个字符串,第二个是一个客户端发送程序。我需要将第一个程序产生的字符串,通过第二个程序实时的发送出去。请问:1.如何把产生的字符串传递个发送程序(每秒产生一个字符串,同时传递给第二个程序)?2.用什么方法比较可行(管道,消息,共享内存,socket...)?3.如何实现,请写出一点简单代码,或提供一点相关信息、网址。 请不吝赐教,高分酬谢,顶者有分!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
AntonlioX
2005-07-21
打赏
举报
回复
还可以用 套接字 进程间通讯
skykeen
2005-07-21
打赏
举报
回复
mark
cryptonym
2005-07-21
打赏
举报
回复
管道比套结子更快。
Kudeet
2005-07-20
打赏
举报
回复
http://www.yesky.com/42/1720542.shtml
fanlin00428
2005-07-20
打赏
举报
回复
谢谢各位,烦请哪位介绍一下共享内存的方法。
linur
2005-07-20
打赏
举报
回复
可用管道, 转一篇文章:
本文将在VC++环境下介绍一个父进程和其子进程的通信实例。在父进程Parent窗口中按一下鼠标左键,就会产生一个管道(Pipe)并启动子进程Child,且从(Pipe)一端发送信息,同时Child启动后会创建一个工作线程,专门用来从管道的另一端读入数据。父进程通过菜单项的控制来改变图形形状参数,并传给Child使之在自己的窗口中绘出响应的图形。下面分别就父进程Parent和子进程Child来进行说明。
父进程Parent
在父进程Parent中,我们将创建管道和启动子进程。首先说明几个相关函数。
创建进程函数:
BOOL CreateProcess(
LPCTSTR lpApplicationName, //应用模式指针
LPTSTR lpCommandLine, // 命令行字符串
LPSECURITY_ATTRIBUTES lpProcessAttributes,
// 进程安全性指针
LPSECURITY_ATTRIBUTES lpThreadAttributes,
// 主线程安全性指针
BOOL bInheritHandles,// 是否继承句柄
DWORD dwCreationFlags,// 进程类型与优先级
LPVOID lpEnvironment,// 环境块指针
LPCTSTR lpCurrentDirectory,// 当前目录
LPSTARTUPINFO lpStartupInfo,
// STARTUPINFO结构指针
LPPROCESS_INformATION lpProcessInformation);
// 新进程信息
创建管道函数:
BOOL CreatePipe(
PHANDLE hReadPipe, // 读句柄变量地址
PHANDLE hWritePipe,// 写句柄变量地址
LPSECURITY_ATTRIBUTES lpPipeAttributes,
// 安全属性指针
DWORDnSize );//管道缓冲区大小
写管道函数:
BOOL WriteFile(
HANDLE hFile;//写入文件句柄
LPCVOID lpBuffer;//写入数据指针
DWORD nNumberOfBytesToWrite;
//要写入字节数量
LPDWORD lpNumberOfBytesWritten;
//已写入字节数地址
LPOVERLAPPED lpOverlapped );
//异步I/O结构指针
下面从编程角度讨论其实现步骤:
1.利用AppWizard(EXE)产生Parent应用框架,然后在文件Parentview.cpp头部加入#in clude<global.h>,其中文件global.h定义了两个进程用于相互通信的结构和常量值。代码如下:
Global.h 共享变量头文件:
typedef struct Figure
{int iShape;// 图形控制参数
} FIGURE,*PFIGURE;
#define ID_RECT 32771
#define ID_ELLIPSE 32772
#define ID_TERMINATE 32773
2.使用ClassWizard工具:选择对应于CParentView类的消息WM_LBUTTONDOWN,选择AddFu nction键,增加函数OnLButtonDown()。在主菜单资源中加入Rect、Ellipse、Terminate菜单项,ID分别为IDC_RECT、IDR_ELLIPSE、IDR_TERMINATE,并在ClassWizard中加入相应函数。
在文件Parentview.h中加入如下代码:
public:
BOOL SendCommand();//发送信息
HANDLE hProcess; //进程句柄
HANDLE hpipeWrite; //管道写句柄
FIGURE figure;
本文给出Parentview.cpp的部分程序代码。
编者注:源代码发表在:http://www.computerworld.com. cn/98/skill/default. htm。
子进程Child
Child启动之后,立刻创建一个新的线程,并在新线程中执行读管道操作,利用读得的参数使主窗口绘出形状。读管道函数为:
BOOL ReadFile(
HANDLE hFile,// 读入文件句柄
LPVOID lpBuffer, // 读入数据缓冲区地址
DWORD nNumberOfBytesToRead;
// 要读入字节数量
LPDWORD lpNumberOfBytesRead,;
// 已读入字节数地址
LPOVERLAPPED lpOverlapped );
// 异步I/O结构指针
首先,从MFC类库中创建新线程,使用ClassWizard工具:选择AddClassNew,输入类名CT hr,在基类列表框中选择“CWinThread",按下Create按钮,生成线程类CThr。然后修改程序代码。本文给出部分源程序。
结论
运行本文例程,在父进程Parent窗口中按一下鼠标左键,就会产生一个Pipe并启动子进程Child;在Parent中选中菜单项Rect或Ellipse时,Child窗口中就会分别绘出矩形和椭圆;选中Terminate时,就会中断通信。以上介绍的是匿名管道,若要增加通信的灵活性还可采用命名管道NamedPipe,读者可尝试实现。
ForTopLevel
2005-07-20
打赏
举报
回复
可以用共享内存,简单点说共享内存就像一个存在于内存中的文件,可以被任何已知句柄的进程访问,但是看你的数据量不大,用WM_COPYDATA消息是不是更好呢?
oyljerry
2005-07-19
打赏
举报
回复
数据量比较少,就用简单的WM_COPYDATA等好了,使用简单
Kudeet
2005-07-19
打赏
举报
回复
使用WM_COPYDATA:
CString str = _T( "Hello" );
HWND hWndReceived = FindWindow( "Receiver", NULL );
COPYDATASTRUCT cpd;
cpd.dwData = 0;
cpd.cbData = strDataToSend.GetLength();
cpd.pData = (void*)str.GetBuffer(cpd.cbData);
SendMessage( hWndReceived, WM_COPYDATA, 0, (LPARAM) & cpd );
str.ReleaseBuffer();
加入映射宏:
BEGIN_MESSAGE_MAP(CMyWnd, CWnd)
//{{AFX_MSG_MAP(CMyWnd)
...
ON_WM_COPYDATA()
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
...
映射函数:
BOOL CMyWnd::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
CString strRecievedText = (LPCSTR) (pCopyDataStruct->lpData);
return CMyWnd::OnCopyData(pWnd, pCopyDataStruct);
}
smartcomplier
2005-07-19
打赏
举报
回复
为什么用两个程序呢?
用两个线程不好吗?
fanlin00428
2005-07-19
打赏
举报
回复
另:字符串大小不定,小于1K
socketManage
socketmanage 一个简单的socket实例代码
操作系统课程设计——IP地址获取实现
利用VC提供的函数实现读取计算机自身IP地址的
程序
comet4j-tomcat6.jar、comet4j-tomcat7.jar、comet4j.js
压缩包中包含comet4j向客户端主动推送所需要的jar包和js(comet4j-tomcat6.jar、comet4j-tomcat7.jar、comet4j.js)
Xb17680214+荣辰辰+02+香农范诺和哈夫曼编码.docx
此word为本人原创,文档内容为:香农范诺编码和哈夫曼编码的matlab实现。word为实验报告形式,内附两种编码原理,matlab实现代码,运行截图以及现象
问题
总结。希望可以帮到有需要的小伙伴,谢谢!
ssh框架中的sparing
ssh框架中的spring4,以及ssh框架整合的实例,该实例比较适合初学者
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章