Sorry to bother you. I am writing code to make this code,"" in this question "Structures and vectors in Boost Shared Memory", the basis
But, I am stuck in compile error of this line.
data.push_back(id); // 14 line in main function This "data" val is no matching "push_back" function. This val is declared by "auto&" in this line.
auto& data = Shared::locate(smt); // 10 line in "while(1)" of main function (This locate(smt) function is construct of a complex struct's vector in shared memory )
I assume that "data" is vector or iterator of the complex struct, but there are no way to run this line that I know.
I wonder I was wrong somewhere in this code, but I don't know where is.
Please, help me.
Note 1: line of "data.push_back(id);" is no matching function for call to ‘boost::container::vector, boost::interprocess::iset_index> > >, boost::interprocess::allocator, boost::interprocess::iset_index> > >, boost::interprocess::segment_manager, boost::interprocess::iset_index> > >::push_back(InData&)’ candidate: void boost::container::vector::push_back(const T&) [with T = BasicInData, boost::interprocess::iset_index> > >; Allocator = boost::interprocess::allocator, boost::interprocess::iset_index> > >, boost::interprocess::segment_manager, boost::interprocess::iset_index> >]|
Note 2 : Now, I try to change to the line below;
cv::Mat_<cv::Vec3b> mat; cv::VideoCapture vcap(0); InData id(Shared::alloc<uchar_allocator>); // camera open check if (!vcap.isOpened()) return -1; But, another compile error occuring "'id' which is of non-class type ". I feel lack of something. How do i do?
// 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; } } 92 Answers
Thank you all for helping. Finally I can get it.
In this line in main function is
InData id; it is changed to
Shared::InData id(smt.get_segment_manager()); This is full code.
#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; } } 1I suggest get BasicInData(const BasicInData &data) and BasicInData &operate =(const BasicInData &data) function.