Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> доступ к объектам другого своего приложения 
:(
    Опции темы
Incinerated
Дата 4.11.2010, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



К примеру есть приложение1, мое собственное. Оно запускается работает и работает скажем к примеру с vector<std::string>... Т.е. хранит какие то строки в процессе своей работы, работа непрерывная. Т.е. конец  у нее есть, но по окончании процесс запускается заново.
Есть приложение2, тоже мое, которому нужно получить в любой момент времени доступ к данному вектору из приложения1. Каким образом этом можно организовать без использования файловой системе(запись в файл/чтение из файла), т.е. можно ли это организовать в памяти все и каким образом?
И еще вопрос, можно ли изменять значения переменных приложения1 из приложения2, например, типа bool и тоже каким образом?

P.S. я даже не знаю как это в гугле искать и не имею представления есть ли такие возможности, поэтому спрашиваю здесь. Спасибо.
PM MAIL   Вверх
Cheloveck
Дата 4.11.2010, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



Цитата(Incinerated @  4.11.2010,  00:14 Найти цитируемый пост)
 есть ли такие возможности

есть

Цитата(Incinerated @  4.11.2010,  00:14 Найти цитируемый пост)
не знаю как это в гугле искать
  • Shared memory
  • Проекция файла в память
  • Пайпы
  • Сокеты

Добавлено через 1 минуту и 1 секунду
Только обращу внимание на то, что программы должны иметь один и тот же рантайм, для корректной работы с STL объектами.


--------------------
user posted image
PM Jabber   Вверх
Incinerated
Дата 4.11.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



нашел пример по вот этому: 
Код

CreateFileMapping()
...

но у меня возникла сразу проблема. У меня вектор классов, и внутри этого класса есть другие классы, небольшой пример:
Код

class c1{
private:
  wstring a,b;
publuc:
 c1(){};
 wstring getA() {return a;}
 wstring getb() {return b;}
 void setA(wstring str) {a = str;}
 void setB(wstring str) {b = str;}
};

class c2{
private:
  vector<c1> v1;
  vector<c2> v2;
...
}

class c3{
private:
 vector<c1> v1;
 vector<c2> v2;
...
}

class c4{
private:
  vector<c3> v1;
...
}

вот примерно такая структура приложения1. Каким образом мне это загнать в FileMapping? просто в итоге, кол-во элементов класса c1 может достигнуть и одного миллиона.

Это сообщение отредактировал(а) Incinerated - 4.11.2010, 11:33
PM MAIL   Вверх
boostcoder
Дата 4.11.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Incinerated @  4.11.2010,  11:28 Найти цитируемый пост)
CreateFileMapping()

даже не представляю как это может помочь задаче..
дай ссылку на пример.

я для подобных задач использую boost.interprocess.
конкретно ваша задача тут.
PM WWW   Вверх
Incinerated
Дата 4.11.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(boostcoder @ 4.11.2010,  10:39)
Цитата(Incinerated @  4.11.2010,  11:28 Найти цитируемый пост)
CreateFileMapping()

даже не представляю как это может помочь задаче..
дай ссылку на пример.

я для подобных задач использую boost.interprocess.
конкретно ваша задача тут.

http://msdn.microsoft.com/en-us/library/aa...28VS.85%29.aspx

а по поводу boost.interprocess есть вопрос, мне каждый вектор нужно так описать?
PM MAIL   Вверх
boostcoder
Дата 4.11.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Incinerated @  4.11.2010,  13:06 Найти цитируемый пост)
мне каждый вектор нужно так описать? 

только тип.

Добавлено через 1 минуту и 33 секунды
Цитата(Incinerated @  4.11.2010,  13:06 Найти цитируемый пост)
http://msdn.microsoft.com/en-us/library/aa...28VS.85%29.aspx

и нафига вам это? это же просто байт-хранилище.
PM WWW   Вверх
Incinerated
Дата 4.11.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(boostcoder @ 4.11.2010,  12:11)
Добавлено @ 13:12
Цитата(Incinerated @  4.11.2010,  13:06 Найти цитируемый пост)
http://msdn.microsoft.com/en-us/library/aa...28VS.85%29.aspx

и нафига вам это? это же просто байт-хранилище.

я просто не знал как организовать такую вещь и мне чуть выше посоветовали нечто похожее, на что я и нашел пример =)
PM MAIL   Вверх
Incinerated
Дата 4.11.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(boostcoder @ 4.11.2010,  10:39)
я для подобных задач использую boost.interprocess.
конкретно ваша задача тут.

Код

//Create a new segment with given name and size
      managed_shared_memory segment(create_only, "MySharedMemory", 65536);
      

вот тут указан размер 65536, я так понимаю сегмент нужно создавать до заполнения векторов и как узнать какой объем памяти выделять к примеру на 100 000 элементов или на 1 миллион? Нельзя же точно знать какой объем они будут занимать. Или можно написать скажем 1 миллиард(1 Gb) и все будет норм? Но опять таки, а если не хватит памяти или не надо столько, как быть с этим?
PM MAIL   Вверх
boostcoder
Дата 4.11.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Incinerated @  4.11.2010,  13:36 Найти цитируемый пост)
Или можно написать скажем 1 миллиард(1 Gb) и все будет норм?

так указывается максимальный размер сегмента. память сразу не выделяется. но наверное это зависит от ОСи. к примеру на линукс, у меня сегмент 8GB. а реально выделяется памяти масими 3.7GB когда в сегменте уже расположены объекты.

Цитата(Incinerated @  4.11.2010,  13:36 Найти цитируемый пост)
Но опять таки, а если не хватит памяти

получите исключение boost::interprocess::bad_alloc

Добавлено через 11 минут и 18 секунд
Цитата(boostcoder @  4.11.2010,  13:44 Найти цитируемый пост)
реально выделяется памяти масими 3.7GB когда в сегменте уже расположены объекты.

т.е. суммарный объем объектов чуть меньше.
PM WWW   Вверх
Incinerated
Дата 4.11.2010, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



я все-таки не особо понял как мне нужно описать вектора мои, описав главный вот так:
Код

typedef allocator<с3, managed_shared_memory::segment_manager>  ShmemAllocator;

//Alias a vector that uses the previous STL-like allocator so that allocates
//its values from the segment
typedef vector<с3, ShmemAllocator> MyVector;

int main(int argc, _TCHAR* argv[])
{
    
   if(argc == 1){ //Parent process
      //Remove shared memory on construction and destruction
      struct shm_remove 
      {
         shm_remove() { shared_memory_object::remove("MySharedMemory"); }
         ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
      } remover;

      //Create a new segment with given name and size
      managed_shared_memory segment(create_only, "MySharedMemory", 65536);

      //Initialize shared memory STL-compatible allocator
      const ShmemAllocator alloc_inst (segment.get_segment_manager());

      //Construct a vector named "MyVector" in shared memory with argument alloc_inst
      MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst);

      for(int i = 0; i < 10; ++i){  //Insert data in the vector
         с3 tmp(L"A");
                 myvector->push_back(tmp);
      }
       _getch();
        segment.destroy<MyVector>("MyVector");
   }
   else{ //Child process
      //Open the managed segment
      managed_shared_memory segment(open_only, "MySharedMemory");  

      //Find the vector using the c-string name
      MyVector *myvector = segment.find<MyVector>("MyVector").first;
    

      //Use vector in reverse order
      MyVector::iterator it = myvector->begin();
      for (; it <myvector->end(); it++){
          c3 tmp = *it;          
          std::wcout << tmp.GetName() << std::endl;
      }
      //When done, destroy the vector from the segment
      segment.destroy<MyVector>("MyVector");
      _getch();
   }

   return 0;
}


вроде ничего лишнего нету, этот пример рабочий, хоть в нем и вырезаны куски, но я самое основное оставил. Т.е. когда запускаешь без параметра программа заполняет вектор и хранит его в общей памяти с таким-то названием, когда с параметром запускаешь он читает данные из этой памяти и выводит в консоль, все в принципе работает. Но возникает проблема когда я добавляю в класс, к примеру, c3 вектор класса c1. Как его нужно описать? описал как vector<c1> *v1 = new vector<c1>;, данные заносятся в вектор myvector, проверил, а вот считаться они не могут, т.е. когда запускаешь программу с параметром для считывания данных, данные класса с3, например, типа wstring считываются, а вектор v1 - пуст. Просто для меня это все ново и не понятно. Как надо было описать вектор класса с1?
PM MAIL   Вверх
boostcoder
Дата 4.11.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Incinerated @  4.11.2010,  18:35 Найти цитируемый пост)
Но возникает проблема когда я добавляю в класс, к примеру, c3 вектор класса c1. Как его нужно описать? описал как vector<c1> *v1 = new vector<c1>;

покажи код.
PM WWW   Вверх
Incinerated
Дата 4.11.2010, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Код

// eeeee.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <tchar.h> 
#include <strsafe.h>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <string>
#include <cstdlib> //std::system
#include <conio.h>
using namespace boost::interprocess;

class sFile
{
private:
    std::wstring m_place;
        std::wstring m_name;
public:
    std::wstring GetName() { return m_name; }
    sFile(){};
    sFile(std::wstring place, std::wstring name) :
    m_place(place), m_name(name)
    {}
};

class sDrive
{
private:

    std::wstring m_name;

        int m_count_files;
        int m_count_dirs;
public:
    vector<sFile> *m_files;
    std::wstring GetName() { return m_name; }
    sDrive(){};
    sDrive(std::wstring name) :
    m_name(name)
    {
        m_count_files = m_count_dirs = 0; 
      m_files = new vector<sFile>;
    }
};



typedef allocator<sDrive, managed_shared_memory::segment_manager>  ShmemAllocator;

typedef vector<sDrive, ShmemAllocator> MyVector;

int main(int argc, _TCHAR* argv[])
{
    
   if(argc == 1){ //Parent process
      //Remove shared memory on construction and destruction
      struct shm_remove 
      {
         shm_remove() { shared_memory_object::remove("MySharedMemory"); }
         ~shm_remove(){ shared_memory_object::remove("MySharedMemory"); }
      } remover;

      //Create a new segment with given name and size
      managed_shared_memory segment(create_only, "MySharedMemory", 65536);

      //Initialize shared memory STL-compatible allocator
      const ShmemAllocator alloc_inst (segment.get_segment_manager());

      //Construct a vector named "MyVector" in shared memory with argument alloc_inst
      MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst);

      for(int i = 0; i < 10; ++i){  //Insert data in the vector
         sDrive tmp(L"A");
         sFile tmp2(L"b",L"c");
         tmp.m_files->push_back(tmp2);
         myvector->push_back(tmp);
      }
      _getch();
   }
   else{ //Child process
      //Open the managed segment
      managed_shared_memory segment(open_only, "MySharedMemory");  

      //Find the vector using the c-string name
      MyVector *myvector = segment.find<MyVector>("MyVector").first;
    

      //Use vector in reverse order
//      std::sort(myvector->rbegin(), myvector->rend());
      MyVector::iterator it = myvector->begin();
      for (; it <myvector->end(); it++){
          sDrive tmp = *it;          
          vector<sFile>::iterator it1 = tmp.m_files->begin();
          std::wcout << (*it1).GetName() << std::endl;
      }
      //When done, destroy the vector from the segment
      segment.destroy<MyVector>("MyVector");
      _getch();
   }

   return 0;
}


т.е. на строчке: vector<sFile>::iterator it1 = tmp.m_files->begin(); кидает ошибку памяти... в отладке видно что вектор m_files пуст.

Это сообщение отредактировал(а) Incinerated - 4.11.2010, 19:09
PM MAIL   Вверх
boostcoder
Дата 4.11.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Incinerated @  4.11.2010,  19:08 Найти цитируемый пост)
m_files = new vector<sFile>;

уберите new.
во первых - нелепо использовать new тут.
во вторых - проблема по все видимости в этом.

Добавлено @ 19:40
Цитата(Incinerated @  4.11.2010,  19:08 Найти цитируемый пост)
class sFile
{
private:
    std::wstring m_place;
        std::wstring m_name;
public:
    std::wstring GetName() { return m_name; }
    sFile(){};
    sFile(std::wstring place, std::wstring name) :
    m_place(place), m_name(name)
    {}
};
class sDrive
{
private:
    std::wstring m_name;
        int m_count_files;
        int m_count_dirs;
public:
    vector<sFile> *m_files;
    std::wstring GetName() { return m_name; }
    sDrive(){};
    sDrive(std::wstring name) :
    m_name(name)
    {
        m_count_files = m_count_dirs = 0; 
      m_files = new vector<sFile>;
    }
};

я бы это заменил на:
Код

struct fs_tree {
   тут несколько аксессоров.
private:
   std::map<wstring, std::vector<wstring> > _tree;
};


Это сообщение отредактировал(а) boostcoder - 4.11.2010, 20:03
PM WWW   Вверх
Incinerated
Дата 4.11.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



Цитата(boostcoder @  4.11.2010,  18:38 Найти цитируемый пост)

уберите new.
во первых - нелепо использовать new тут.
во вторых - проблема по все видимости в этом.

Почему нелепо создавать объект в конструкторе класса? И почему проблема в этом, если в этом куске кода все работает как я и писал выше:
Код

    for(int i = 0; i < 10; ++i){  //Insert data in the vector
         sDrive tmp(L"A");
         sFile tmp2(L"b",L"c");
         tmp.m_files->push_back(tmp2);
         myvector->push_back(tmp);
      }

т.е. если после цикла запустить цикл выводящий элементы вектора m_files, то он все выводит хорошо. А во 2-ом приложении вектор пуст. И каким образом инициализация вектора в конструкторе может этому мешать?

Цитата(boostcoder @  4.11.2010,  18:38 Найти цитируемый пост)

я бы это заменил на:
Код

struct fs_tree {
   тут несколько аксессоров.
private:
   std::map<wstring, std::vector<wstring> > _tree;
};


что такое аксессоры? и у вас получилось map - карта? слышал, но толком не знаю, но так как вы назвали _tree - это видимо некое дерево или граф. И получается каждая ветка имеет 2 значения wstring и вектор типа wstring и все, а мне надо больше у меня sFile имеет более 10 переменных, их все перечислять через запятую или как? и как с этим тогда работать, и почему нельзя сделать так как я написал(структура)?

Это сообщение отредактировал(а) Incinerated - 4.11.2010, 21:25
PM MAIL   Вверх
boostcoder
Дата 4.11.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Incinerated @  4.11.2010,  21:25 Найти цитируемый пост)
Почему нелепо создавать объект в конструкторе класса?

потому что -
Цитата(boostcoder @  4.11.2010,  19:38 Найти цитируемый пост)
нелепо использовать new тут


Цитата(Incinerated @  4.11.2010,  21:25 Найти цитируемый пост)
И почему проблема в этом, если в этом куске кода все работает как я и писал выше:

Цитата(Incinerated @  4.11.2010,  21:25 Найти цитируемый пост)
т.е. если после цикла запустить цикл выводящий элементы вектора m_files, то он все выводит хорошо. А во 2-ом приложении вектор пуст. И каким образом инициализация вектора в конструкторе может этому мешать?

вы пытаетесь расшарить область памяти между процессами. при этом, часть объектов которые должны быть в расшаренной памяти, создаете в локальной памяти процесса. и как в таком случае, сторонний процесс получит локальную память другого процесса? smile 

Цитата(Incinerated @  4.11.2010,  21:25 Найти цитируемый пост)
и у вас получилось map - карта?

типа того. где ключ - имя каталога, а значение - список имен файлов этого каталога. это как пример. храните в векторе не строки, и ваши структуры. разницы никакой..

PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0866 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.