进程间通信的简单知识点

进程间通信主要包括三种:消息,剪贴板,内存映射。


消息:这种方法的实现主要用了WM_COPYDATA,从内存的2G开辟了公共空间,我们发消息时用到了 :SendMessage ,而为什么不用PostMessage呢,这是因为如果用了PostMessage的话,你要是不去取它,它就会一直都占用着内存,会造成内核浪费。


剪贴板:

        主要包括了复制和粘贴两个部分.下面是两部分的基本步骤:

复制:

 1.打开剪贴板 OpenClipboard

2.清空剪贴板 EmptyClipboard

3.申请全局堆空间GlobalAlloc

4.加锁GloLock

5复制内容操作

6.解锁GlobalUnlock

7.设置剪贴板的数据格式SetClipboardData

8.关闭剪贴板 Closeclipboard


粘贴:

1.打开剪贴板 OpenClipboard

2.检验剪贴板数据格式:IsclipboardFormatAvailable;

3.得到剪贴板数据GetClipboardData

4.加锁GloLock

5.取内容

6.解锁GlobalUnlock

7.关闭剪贴板 Closeclipboard


内存映射:

因为是在物理内存申请,跳过了系统这一环节,所以速度很快,我做了一个实验循环创建,删除10W数据,内存映射方法大概用了5秒左右,

而new delete 用时接近一分钟,效率提高了10倍左右。

以下是我实现的一个应用 内存映射 发送字符串的小例子:

发送端:

HANDLE hFileMaping = NULL;
CString strValue;
int nSize;


m_edt.GetWindowText(strValue);
if (!strValue.IsEmpty())
{
nSize = strValue.GetLength()+1;


hFileMaping = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,nSize,"MyFIleMapping");


char *pStartAddr = (char *)MapViewOfFile(hFileMaping,FILE_MAP_WRITE|FILE_MAP_READ,0,0,nSize);
strcpy(pStartAddr,strValue.GetBuffer());


UnmapViewOfFile(pStartAddr);
}
}


接收端:

HANDLE hRecvMaping;
hRecvMaping = OpenFileMapping(FILE_MAP_READ,FALSE,"MyFIleMapping");
if (hRecvMaping)
{
char *str = (char *)MapViewOfFile(hRecvMaping,FILE_MAP_READ,0,0,0);


m_strContent.Format("%s",str);


UnmapViewOfFile(str);
Invalidate(TRUE);
}
CloseHandle(hRecvMaping); 

以上就是我近期的理解,希望大家多多交流.微笑


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值