如何在 boost.process 间共享内存中使用复杂结构"push_back"函数向量
How to use "push_back" function vector of Complex struct in boost.interprocess shared memory
很抱歉打扰您。我正在编写代码以生成此代码,"http://coliru.stacked-crooked.com/a/0ab21481b69d87bb在这个问题"Boost共享内存中的结构和向量"中,的基础
但是,我陷入了这一行的编译错误。
data.push_back(id); // 14 line in main function
此"数据"val不是匹配的"push_back"函数。此val由此行中的"auto&"声明。
auto& data = Shared::locate(smt); // 10 line in "while(1)" of main function
(这个定位(smt)函数是在共享内存中构造复杂结构的向量)
我假设"data"是复杂结构的向量或迭代器,但据我所知,并没有办法运行这一行。
我想知道我在这个代码的某个地方错了,但我不知道在哪里。
请帮帮我。
注意1:"data.push_back(id);"的行没有匹配的函数用于调用"boost::container::vector,boost::interprocess::iset_index>>,boost::interprocess::allocater,boost::interprocess::iset_index>>>,boost::interprocess::segment_manager,boost::interrocess::iset_index>>:::push_back(InData&)">候选者:void boost::container::vector::push_back(const T&
注意2:现在,我试着换到下面的行;
cv::Mat_<cv::Vec3b> mat;
cv::VideoCapture vcap(0);
InData id(Shared::alloc<uchar_allocator>);
// camera open check
if (!vcap.isOpened())
return -1;
但是,另一个编译错误出现在"非类类型的'id'"中。我觉得缺少什么。我该怎么办?
// opencv's lib
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
// opencv's lib end
#include <string>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/managed_mapped_file.hpp> // use for Coliru
#include <boost/interprocess/containers/vector.hpp> // boost/containers/vector.hpp
#include <boost/interprocess/containers/string.hpp> // boost/containers/string.hpp
#include <iostream>
#include <sys/time.h>
#include <stdio.h>
// void_allocator;
namespace bip = boost::interprocess;
typedef unsigned char uchar;
//Typedefs of allocators and containers
typedef bip::managed_shared_memory::segment_manager segment_manager_t;
typedef bip::allocator<void, segment_manager_t> void_allocator;
typedef void_allocator::rebind<uchar>::other uchar_allocator;
typedef bip::vector<uchar, uchar_allocator> uchar_vector;
template <typename Alloc = std::allocator<char> >
struct BasicInData {
public:
BasicInData(Alloc alloc = {}) : image(alloc)
{ }
template <typename T>
BasicInData(double x, int sizeImg, uchar_vector& image, Alloc alloc = {}) :
x(x), sizeImg(sizeImg), image(alloc)
{ }
double x = 0;
int sizeImg = 0;
uchar_vector image;
};
using InData = BasicInData<>; // just heap allocated
namespace Shared {
using segment = bip::managed_shared_memory;
using segment_manager = segment::segment_manager;
template <typename T> using alloc = bip::allocator<T, segment_manager>;
template <typename T> using vector = bip::vector<T, alloc<T> >;
using InData = BasicInData<alloc<char> >; // shared memory version
vector<InData>& locate(segment& smt) {
auto* v = smt.find_or_construct<vector<InData> >("InDataVector")(smt.get_segment_manager());
assert(v);
return *v;
}
}
int main(int argc, char* argv[]) {
if(argc == 1){ //Parent process
struct timeval tv;
// there are making no sense 2 line in below, just examine
gettimeofday(&tv, NULL);
double time = ((double)tv.tv_usec/1000000);
// Remove shared memory on construction and destruction
// Create a new segment with given name and size
struct shm_remove
{
shm_remove(){bip::shared_memory_object::remove("MySharedMemory");}
~shm_remove(){bip::shared_memory_object::remove("MySharedMemory");}
}remover;
Shared::segment smt(bip::create_only,"MySharedMemory", 65536); // 65536 for coliru
auto& data = Shared::locate(smt);
//Shared::alloc bip::alloc_inst (data);
// Camera Capture
cv::Mat_<cv::Vec3b> mat;
cv::VideoCapture vcap(0);
InData id;
// camera open check
if (!vcap.isOpened())
return -1;
while (1) { // while keyboard key push
vcap >> mat; // camera to mat
int image_size = mat.total() * mat.elemSize();
id.sizeImg = image_size;
id.image.resize(image_size * sizeof(uchar));
memcpy(&id.image[0], mat.data, image_size * sizeof(uchar));
// get microsecond by double
gettimeofday(&tv, NULL);
double time = ((double)tv.tv_usec/1000000);
id.x = time;
data.push_back(id);
if(cv::waitKey(30) >= 0) break; // keyboard pushed
}
//Launch child process
std::string s(argv[0]); s += " child";
if(0 != std::system(s.c_str()))
return 1;
// check child has destroyed the vector
if(segment.find<vector<InData>>("InDataVector").first)
return 1;
}
}else{
// Open the managed segment
managed_shared_memory segment(open_only, "MySharedMemory");
// Find the vector
vector<InData> *myvector = segment.find<vector<InData>>("InDataVector").first;
// Use vector in reverse order
vector<InData>::iterator it;
cv::Mat_<cv::Vec3b> im;
for(it = myvector->begin(); it !=myvector->end(); ++it){
im.resize(it->sizeImg);
memcpy(im.data, &imref[0], it->sizeImg);
cv::imshow("window1", im);
}
segment.destroy<vector<InData>>("InDataVector");
return 0;
}
}
感谢大家的帮助。我终于可以拿到了。
在这一行中,主要功能是
InData id;
它被改为
Shared::InData id(smt.get_segment_manager());
这是完整的代码。
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/managed_mapped_file.hpp> // use for Coliru
#include <boost/interprocess/containers/vector.hpp> // boost/containers/vector.hpp
#include <boost/interprocess/containers/string.hpp> // boost/containers/string.hpp
#include <iostream>
#include <sys/time.h>
#include <stdio.h>
// void_allocator;
namespace bip = boost::interprocess;
typedef unsigned char uchar;
//Typedefs of allocators and containers
typedef bip::managed_shared_memory::segment_manager segment_manager_t;
typedef bip::allocator<void, segment_manager_t> void_allocator;
typedef void_allocator::rebind<uchar>::other uchar_allocator;
typedef bip::vector<uchar, uchar_allocator> uchar_vector;
template <typename Alloc = std::allocator<uchar> >
struct BasicInData {
public:
BasicInData(Alloc alloc = {}) : image(alloc)
{ }
template <typename T>
BasicInData(double x, int sizeImg, uchar_vector& image, Alloc alloc = {}) :
x(x), sizeImg(sizeImg), image(alloc)
{ }
double x = 0;
int sizeImg = 0;
uchar_vector image;
};
using InData = BasicInData<>; // just heap allocated
namespace Shared {
using segment = bip::managed_shared_memory;
using segment_manager = segment::segment_manager;
template <typename T> using alloc = bip::allocator<T, segment_manager>;
template <typename T> using vector = bip::vector<T, alloc<T> >;
using InData = BasicInData<alloc<uchar> >; // shared memory version
vector<InData>& locate(segment& smt) {
auto* v = smt.find_or_construct<vector<InData> >("InDataVector")(smt.get_segment_manager());
assert(v);
return *v;
}
}
int main(int argc, char* argv[]) {
if(argc == 1){ //Parent process
// Remove shared memory on construction and destruction
// Create a new segment with given name and size
struct timeval tv;
gettimeofday(&tv, NULL);
struct shm_remove
{
shm_remove(){bip::shared_memory_object::remove("MySharedMemory");}
~shm_remove(){bip::shared_memory_object::remove("MySharedMemory");}
}remover;
Shared::segment smt(bip::create_only,"MySharedMemory", 65536); // 10 Kb for coliru
auto &data = Shared::locate(smt);
//Shared::alloc bip::alloc_inst (data);
cv::Mat_<cv::Vec3b> mat;
cv::VideoCapture vcap(0);
Shared::InData id(smt.get_segment_manager());
if (!vcap.isOpened())
return -1;
while (1) {
vcap >> mat;
int image_size = mat.total() * mat.elemSize();
id.sizeImg = image_size;
id.image.resize(image_size * sizeof(uchar));
memcpy(&id.image[0], mat.data, image_size * sizeof(uchar));
//Launch child process
gettimeofday(&tv, NULL);
double time = ((double)tv.tv_usec/1000000);
id.x = time;
data.push_back(id);
if(cv::waitKey(30) >= 0) break;
}
std::string s(argv[0]); s += " child";
if(0 != std::system(s.c_str()))
return 1;
// check child has destroyed the vector
if(smt.find<Shared::vector<InData>>("InDataVector").first)
return 1;
} else{
// Open the managed segment
bip::managed_shared_memory segment(bip::open_only, "MySharedMemory");
// Find the vector using c-string name
bip::vector<InData> *myvector = segment.find<bip::vector<InData>>("InDataVector").first;
// Use vector in reverse order
bip::vector<InData>::iterator it;
cv::Mat_<cv::Vec3b> im;
for(it = myvector->begin(); it !=myvector->end(); ++it){
im.resize(it->sizeImg);
memcpy(im.data, &it->image[0], it->sizeImg);
cv::imshow("window1", im);
}
segment.destroy<bip::vector<InData>>("InDataVector");
return 0;
}
}
我建议获取BasicInData(const BasicInData &data)
和BasicInData &operate =(const BasicInData &data)
函数。
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 复杂的标准::地图,结构,标准::d问题
- 比较复杂的结构
- std::结构复杂,使编译速度变慢
- 将数据插入一些复杂的数据结构-C
- 获取从 C++ 到 C# 的复杂结构
- 将复杂的结构(带有结构的内部数组)从 C# 传递到C++
- 哪种控制结构所需的时间复杂度更低?
- 编写C 简化具有复杂层次结构的C 类的包装器,以便Cython可以称呼它
- QT:使用QVariant任意复杂的数据结构
- Calloc vs new 用于各种编译器中的复杂结构
- boost::property_tree:复杂xml结构的解析
- 在客户端和服务器之间序列化复杂的C++结构
- 如何在 boost.process 间共享内存中使用复杂结构"push_back"函数向量
- C#与C++之间的复杂结构编组
- 如何使用boost :: intercons :: vector在共享内存中分配复杂的结构
- 最短路径的dijkstra算法的时间复杂度是否取决于所使用的数据结构?
- 具有恒定时间复杂度的无向图边的数据结构
- 是否可以将复杂的 Go 结构导出/包装为 C
- 如何在c++中高效地从结构复杂的文件中读取二进制数据