多线程之间消息传递和二进制数据拷备
来源:互联网 发布:网络商标查询 编辑:程序博客网 时间:2024/05/14 06:40
eint CLAIInfo::OnGetCommonData(eint nIPCID,eint8* pbPackBuf,eint nReqLen,eint8** ppReply,eint nMsgCode)
{
// eint8* pbMsgData = NULL;
// SensorData* psCmdStr = NULL;
//
// psCmdStr = (SensorData*)pbReqStr;
// pbMsgData = (eint8*)malloc(nReqLen);//alloc memory space to store request data
// memset(pbMsgData,0,nReqLen);
// memcpy(pbMsgData,pbReqStr,nReqLen);|||||||| IPCBaseStr中的时间戳和优先级字节不对齐,所以不可以强转取数据,只能MemM_GetDataFromMem
eint nPos=0;
euint32 ulCmdCode=0;
IPCBaseStr sCmdStr;
nPos = MemM_GetDataFromMem(pbPackBuf,&ulCmdCode,sizeof(euint32),0);
nPos = MemM_GetDataFromMem(pbPackBuf,&sCmdStr.unPriority,sizeof(euint32),nPos);
nPos = MemM_GetDataFromMem(pbPackBuf,&sCmdStr.dTimeStamp,sizeof(edouble),nPos);//获得时间和优先级,只发单个的变量,不需要在堆中生成内存
eint8* pbMsgData = NULL;
pbMsgData = (eint8*)malloc(nReqLen);//alloc memory space to store request data
memset(pbMsgData,0,nReqLen);
memcpy(pbMsgData,pbPackBuf,nReqLen);//多线程,发送之间要malloc内存,发送堆中的数据
//post message to laicontrol to process
m_piMsgCtrl->PostMessage((CEMsgReceiver*)m_pMsgRecv,
HaiPriSensor+sCmdStr.unPriority,
sCmdStr.dTimeStamp,
nMsgCode,
(eint)pbMsgData,
nReqLen);
return ERR_NONE;
}
二进制数据拷备:
数据在进程之间是以二进制数的形式传输的,即进程间通讯IPC是用二进制数传递的;
通过IPC传输的结构体数据不能用结构体强制类型转换获取其中的数据;
这是因为结构体数据有字节对齐,而二进制数数据没有;
如果一定用强制类型转换要非常小心,只有字节对齐的情况才可以获得正确的数据;
typedef struct _ipc_base_struct{
euint32 unPriority;
edouble dTimeStamp;
}IPCBaseStr;
如上面的结构体中,在64位机中euint32是4个字节,edouble是8个字节,字节没有对齐;
结构体的长度是16,二进制数据包的长度是12...一取就错!
多线程:
同一进程下的两个线程共用一块堆;
不同的线程之间传递的变量,必须是在堆中生成的,即new或malloc的内存内容;
如果只发单个变量,可用临时变量;
{
// eint8* pbMsgData = NULL;
// SensorData* psCmdStr = NULL;
//
// psCmdStr = (SensorData*)pbReqStr;
// pbMsgData = (eint8*)malloc(nReqLen);//alloc memory space to store request da
// memset(pbMsgData,0,nReqLen);
// memcpy(pbMsgData,pbReqStr,nReqLen);|||||||| IPCBaseStr中的时间戳和优先级字节不对齐,所以不可以强转取数据,只能MemM_GetDataFromMem
eint nPos=0;
euint32 ulCmdCode=0;
IPCBaseStr sCmdStr;
nPos = MemM_GetDataFromMem(pbPackBuf,&ulCmdCode,sizeof(euint32),0);
nPos = MemM_GetDataFromMem(pbPackBuf,&sCmdStr.unPriority,sizeof(euint32),nPos);
nPos = MemM_GetDataFromMem(pbPackBuf,&sCmdStr.dTimeStamp,sizeof(edouble),nPos);//获得时间和优先级,只发单个的变量,不需要在堆中生成内存
eint8* pbMsgData = NULL;
pbMsgData = (eint8*)malloc(nReqLen);//alloc memory space to store request da
memset(pbMsgData,0,nReqLen);
memcpy(pbMsgData,pbPackBuf,nReqLen);//多线程,发送之间要malloc内存,发送堆中的数据
//post message to laicontrol to process
m_piMsgCtrl->PostMessage((CEMsgReceiver*)m_pMsgRecv,
HaiPriSensor+sCmdStr.unPriority,
sCmdStr.dTimeStamp,
nMsgCode,
(eint)pbMsgData,
nReqLen);
return ERR_NONE;
}
二进制数据拷备:
数据在进程之间是以二进制数的形式传输的,即进程间通讯IPC是用二进制数传递的;
通过IPC传输的结构体数据不能用结构体强制类型转换获取其中的数据;
这是因为结构体数据有字节对齐,而二进制数数据没有;
如果一定用强制类型转换要非常小心,只有字节对齐的情况才可以获得正确的数据;
typedef struct _ipc_base_struct{
euint32 unPriority;
edouble dTimeStamp;
}IPCBaseStr;
如上面的结构体中,在64位机中euint32是4个字节,edouble是8个字节,字节没有对齐;
结构体的长度是16,二进制数据包的长度是12...一取就错!
多线程:
不同的线程之间传递的变量,必须是在堆中生成的,即new或malloc的内存内容;
如果只发单个变量,可用临时变量;
阅读全文
0 0
- 多线程之间消息传递和二进制数据拷备
- Android和Acitivity之间如何传递数据消息
- Acitivity 之间如何传递消息(数据)
- Acitivity之间如何传递消息(数据)
- CCNotificationCenter传递消息和数据
- HTML5 windows和iframe之间传递消息
- C#窗体之间传递消息和事件
- Acitivity和Service之间消息的传递
- EXE之间传递消息
- EXE之间传递消息
- 驱动之间消息传递
- Fragment之间消息传递
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- 用WM_COPYDATA消息来实现两个进程之间传递数据
- MFC多线程消息传递
- iOS NSDecimalNumber用法 加减乘除 解决字符串转float类型不准确 结尾无法去0处理 用于货币处理
- Oracle常用查询(持续更新中...)
- 用AFNetworking请求的时候GET正常,而POST时后台缺收不到数据,最坑的就是安卓还是正常的
- 69. Sqrt(x)
- Linux下Mongdb的使用(一)
- 多线程之间消息传递和二进制数据拷备
- Appium之Mac配置Appium全过程
- 编译错误 jump to case label [-fpermissive]
- c++ 深浅拷贝
- 模拟退火算法
- Android窗口机制分析与UI管理系统
- 关于c++ 中内存拷贝 内存写超的情况分析
- c++ 中字节对齐
- 编辑器、编译器和链接器的概念和区别