如何存储封送处理的数据
How can I store marshaled data?
我有一个rpc-com接口,它将数据从服务传递到客户端。在客户端,我需要临时存储这些数据,并将其放入队列中,以便稍后在ui线程上处理(这需要在ui线程中完成,因为这是需要创建视图和视图模型对象的地方(。
该结构有点复杂,包含指向其他结构和可变长度字符串的指针。
问题-有没有一种简单的方法可以获取整理后的内存的完整"blob"进行存储,或者我需要复制相同的结构并自己重新打包,以便以后在ui线程上处理它?目前,这看起来像是复制相同的结构,但用CComBSTR等替换LPCWSTR,这对我来说似乎有点肮脏和浪费…
感谢
在您需要理解数据之前,您可以将其视为一个字节序列。你唯一需要知道的就是你有多少数据。然后你可以做一些类似的事情:
std::vector<unint8_t> buf;
buf.resize(length);
memcpy(&buf[0], source, length);
然后在稍后的时间点,假设你的矢量仍然在附近
memcpy(dest, &buf[0], buf.size());
当矢量超出范围时,它将被释放。
唯一可能有点棘手的事情可能是获得长度。这可能需要对发送的数据有一些了解,但除此之外,没有必要对数据进行解包。
您应该在后台线程和UI线程之间封送数据(例如,请参阅CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream(。在线程之间直接传递COM对象是非法的。
使用上面提到的API,您将生成IStream
对象并对相应的指针进行排队。然后UI线程将最终恢复指针,调用第二个API,并检索对象的编组副本。
这一切都假设数据一开始就在COM对象中。如果它是COM对象通过连线复制的blob,那么正确的语义规定,当您从COM对象请求数据时,您获得了它的所有权(以及释放/删除它的责任(。然后,只需将指向数据的指针按原样排队,并让UI线程执行释放/删除操作(如何?我不确定;我必须查找它。也许是CoTaskMemFree((?(
如果这是一个更奇怪的场景,请澄清这是什么。
- 使用流处理接收到的数据
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 我可以使用哪种数据结构来处理这种方式
- OpenCV(C++)处理来自JavaScript / Web Assembly的图像数据
- 在线程函数中处理数据向量时进行线程竞速
- 而(getline(fin,str)){}即使在到达eof之后仍在处理数据
- 如何以低于相机每秒帧数的能力处理数据?
- 处理数据包的设计模式
- C 图像处理数据块进入数组 /指针
- 如何使用 C++ 驱动程序在 MongoDB 中使用 UserException 处理数据类型错误
- 实时绘图的信号处理数据(c++中的FFT和GNUPLOT)
- 处理数据的方法,速度是我处理速度的两倍
- 如何使用STL迭代器和reverse_iterator处理数据
- MFC树视图控件:寻找一种万无一失的方法来处理数据
- 从套接字递归处理数据
- boost::p roperty_:tree - 解析和处理数据
- 这段代码是否在作为参数传递时处理数据有点困惑
- 神经网络似乎工作得很好,直到用于处理数据(所有的结果几乎是相同的)
- 在托管c#应用程序的非托管c++ Dll调用中,如何处理数据类型之间的冲突