Advertisement
agrippa1994

Shared Memory

Feb 4th, 2013
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.35 KB | None | 0 0
  1. #include <boost/interprocess/windows_shared_memory.hpp>
  2. #include <boost/interprocess/mapped_region.hpp>
  3. #include <boost/date_time/posix_time/posix_time.hpp>
  4. #include <boost/thread.hpp>
  5. #include <boost/bind.hpp>
  6.  
  7. #include <cstring>
  8. #include <cstdlib>
  9. #include <string>
  10. #include <iostream>
  11.  
  12. #include <windows.h>
  13.  
  14. #define SIZE 10000
  15.  
  16. using namespace boost;
  17. using namespace boost::interprocess;
  18. using namespace std;
  19.  
  20. class CSharedMemory
  21. {
  22.    
  23. public:
  24.     enum eMode{ Mode_None,Mode_Parent, Mode_Child };
  25.  
  26.     CSharedMemory(eMode Mode,string name) : m_IsOpen(false), m_Mode(Mode)
  27.     {
  28.  
  29.         m_ParentSHM     =   NULL;
  30.         m_ParentRegion  =   NULL;
  31.         m_ChildSHM      =   NULL;
  32.         m_ChildRegion   =   NULL;
  33.         m_Thread        =   NULL;
  34.  
  35.         // Setzen der Informationen
  36.         m_Name = name;
  37.  
  38.         if(Mode == Mode_None) { return; }
  39.  
  40.         // Initialisieren des Threads, und des SM
  41.         m_IsOpen = Init();
  42.     }
  43.     ~CSharedMemory()
  44.     {
  45.         if(m_Thread)
  46.         {
  47.             m_Thread->interrupt();
  48.  
  49.             if(m_Thread->joinable())
  50.                 m_Thread->join();
  51.  
  52.             delete m_Thread;
  53.         }
  54.        
  55.         if(m_ParentSHM)
  56.             delete m_ParentSHM;
  57.         if(m_ParentRegion)
  58.             delete m_ParentRegion;
  59.        
  60.         if(m_ChildSHM)
  61.             delete m_ChildSHM;
  62.         if(m_ChildRegion)
  63.             delete m_ChildRegion;
  64.        
  65.         m_IsOpen = false;
  66.     }
  67.  
  68.     bool IsOpen() { return m_IsOpen; }
  69.  
  70.     bool Write(const char *data,size_t size)
  71.     {
  72.         if(!m_IsOpen) return false;
  73.  
  74.         if(m_Mode == Mode_Parent)
  75.         {
  76.             if(size > m_ParentRegion->get_size()) return false;
  77.  
  78.             memset(m_ParentRegion->get_address(),0,m_ParentRegion->get_size());
  79.             memcpy(m_ParentRegion->get_address(),data,size);
  80.  
  81.             return true;
  82.         }
  83.         else if(m_Mode == Mode_Child)
  84.         {
  85.             if(size > m_ChildRegion->get_size()) return false;
  86.  
  87.             memset(m_ChildRegion->get_address(),0,m_ChildRegion->get_size());
  88.             memcpy(m_ChildRegion->get_address(),data,size);
  89.  
  90.             return true;
  91.         }
  92.         return false;
  93.     }
  94.  
  95.     eMode GetMode() { return m_Mode; }
  96. protected:
  97.     virtual void OnMessage(char *data,size_t size)
  98.     {
  99.         if(m_Mode == Mode_Parent)
  100.             cout << "Nachricht von Child: " << data << endl;
  101.         else if(m_Mode == Mode_Child)
  102.             cout << "Nachricht von Parent: " << data << endl;
  103.  
  104.         return;
  105.     }
  106.  
  107.     void Thread()
  108.     {
  109.         while(1)
  110.         {
  111.             // "Unterbrechungs" Punkt
  112.             boost::this_thread::interruption_point();
  113.  
  114.             if(m_Mode == Mode_Parent)
  115.             {
  116.                 if(((char *)(m_ChildRegion->get_address()))[0] != NULL)
  117.                 {
  118.                     char *data = new char[m_ChildRegion->get_size()];
  119.                     memset(data,NULL,m_ChildRegion->get_size());
  120.  
  121.                     memcpy(data,m_ChildRegion->get_address(),m_ChildRegion->get_size());
  122.  
  123.                     OnMessage(data,m_ChildRegion->get_size());
  124.  
  125.                     delete [] data;
  126.  
  127.                     memset(m_ChildRegion->get_address(),0,m_ChildRegion->get_size());
  128.                 }
  129.             }
  130.             else if(m_Mode == Mode_Child)
  131.             {
  132.                 if(((char *)(m_ParentRegion->get_address()))[0] != NULL)
  133.                 {
  134.                     char *data = new char[m_ParentRegion->get_size()];
  135.                     memset(data,NULL,m_ParentRegion->get_size());
  136.  
  137.                     memcpy(data,m_ParentRegion->get_address(),m_ParentRegion->get_size());
  138.  
  139.                     OnMessage(data,m_ParentRegion->get_size());
  140.  
  141.                     delete [] data;
  142.  
  143.                     memset(m_ParentRegion->get_address(),0,m_ParentRegion->get_size());
  144.                 }
  145.             }
  146.        
  147.             boost::this_thread::sleep(boost::posix_time::millisec(10));
  148.         }
  149.     }
  150. private:
  151.     eMode                   m_Mode;
  152.     bool                    m_IsOpen;
  153.  
  154.     windows_shared_memory   *m_ParentSHM;
  155.     mapped_region           *m_ParentRegion;
  156.  
  157.     windows_shared_memory   *m_ChildSHM;
  158.     mapped_region           *m_ChildRegion;
  159.  
  160.     boost::thread           *m_Thread;
  161.     string                  m_Name;
  162.  
  163.     bool Init()
  164.     {
  165.         if(m_Mode == Mode_Parent)
  166.         {
  167.             try { m_ParentSHM = new windows_shared_memory(create_only,(m_Name + "_Parent").c_str(),read_write,SIZE); }
  168.             catch(...) { return false; }
  169.  
  170.             try { m_ParentRegion = new mapped_region(*m_ParentSHM,read_write); }
  171.             catch(...) { return false; }
  172.  
  173.             try { m_ChildSHM = new windows_shared_memory(create_only,(m_Name + "_Child").c_str(),read_write,SIZE); }
  174.             catch(...) { return false; }
  175.  
  176.             try { m_ChildRegion = new mapped_region(*m_ChildSHM,read_write); }
  177.             catch(...) { return false; }
  178.  
  179.             try { m_Thread = new boost::thread(boost::bind(&CSharedMemory::Thread,this)); }
  180.             catch(...) { return false; }
  181.  
  182.             return true;
  183.         }
  184.         else if(m_Mode == Mode_Child)
  185.         {
  186.             try { m_ParentSHM = new windows_shared_memory(open_only,(m_Name + "_Parent").c_str(),read_write); }
  187.             catch(...) { return false; }
  188.  
  189.             try { m_ParentRegion = new mapped_region(*m_ParentSHM,read_write); }
  190.             catch(...) { return false; }
  191.  
  192.             try { m_ChildSHM = new windows_shared_memory(open_only,(m_Name + "_Child").c_str(),read_write); }
  193.             catch(...) { return false; }
  194.  
  195.             try { m_ChildRegion = new mapped_region(*m_ChildSHM,read_write); }
  196.             catch(...) { return false; }
  197.  
  198.             try { m_Thread = new boost::thread(boost::bind(&CSharedMemory::Thread,this)); }
  199.             catch(...) { return false; }
  200.  
  201.             return true;
  202.         }
  203.  
  204.         return false;
  205.        
  206.     }
  207. };
  208.  
  209. int main(int argc, char *argv[])
  210. {
  211.     CSharedMemory *Parent = new CSharedMemory(CSharedMemory::Mode_Parent,"Memory");
  212.     CSharedMemory *Child  = new CSharedMemory(CSharedMemory::Mode_Child,"Memory");
  213.  
  214.     char *str = "hallo welt!";
  215.  
  216.     while(1)
  217.     {
  218.         if(GetAsyncKeyState(VK_NUMPAD1))
  219.         {
  220.             Parent->Write(str,strlen(str));
  221.         }
  222.         if(GetAsyncKeyState(VK_NUMPAD2))
  223.         {
  224.             Child->Write(str,strlen(str));
  225.         }
  226.         else if(GetAsyncKeyState(VK_NUMPAD3))
  227.         {
  228.             delete Child;
  229.             delete Parent;
  230.             break;
  231.         }
  232.         Sleep(50);
  233.     }
  234.  
  235.     getchar();
  236.     return 0;
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement