| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > доступ к объектам другого своего приложения |
| Автор: Incinerated 4.11.2010, 00:14 |
| К примеру есть приложение1, мое собственное. Оно запускается работает и работает скажем к примеру с vector<std::string>... Т.е. хранит какие то строки в процессе своей работы, работа непрерывная. Т.е. конец у нее есть, но по окончании процесс запускается заново. Есть приложение2, тоже мое, которому нужно получить в любой момент времени доступ к данному вектору из приложения1. Каким образом этом можно организовать без использования файловой системе(запись в файл/чтение из файла), т.е. можно ли это организовать в памяти все и каким образом? И еще вопрос, можно ли изменять значения переменных приложения1 из приложения2, например, типа bool и тоже каким образом? P.S. я даже не знаю как это в гугле искать и не имею представления есть ли такие возможности, поэтому спрашиваю здесь. Спасибо. |
| Автор: Cheloveck 4.11.2010, 00:31 |
есть
Добавлено через 1 минуту и 1 секунду Только обращу внимание на то, что программы должны иметь один и тот же рантайм, для корректной работы с STL объектами. |
| Автор: Incinerated 4.11.2010, 11:28 | ||||
нашел пример по вот этому:
но у меня возникла сразу проблема. У меня вектор классов, и внутри этого класса есть другие классы, небольшой пример:
вот примерно такая структура приложения1. Каким образом мне это загнать в FileMapping? просто в итоге, кол-во элементов класса c1 может достигнуть и одного миллиона. |
| Автор: boostcoder 4.11.2010, 11:39 |
даже не представляю как это может помочь задаче.. дай ссылку на пример. я для подобных задач использую http://www.boost.org/doc/libs/1_44_0/doc/html/interprocess.html. конкретно ваша задача http://www.boost.org/doc/libs/1_44_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_container. |
| Автор: Incinerated 4.11.2010, 13:06 | ||
http://msdn.microsoft.com/en-us/library/aa366551%28VS.85%29.aspx а по поводу boost.interprocess есть вопрос, мне каждый вектор нужно так описать? |
| Автор: boostcoder 4.11.2010, 13:11 |
только тип. Добавлено через 1 минуту и 33 секунды и нафига вам это? это же просто байт-хранилище. |
| Автор: Incinerated 4.11.2010, 13:15 | ||
я просто не знал как организовать такую вещь и мне чуть выше посоветовали нечто похожее, на что я и нашел пример =) |
| Автор: Incinerated 4.11.2010, 13:36 | ||||
вот тут указан размер 65536, я так понимаю сегмент нужно создавать до заполнения векторов и как узнать какой объем памяти выделять к примеру на 100 000 элементов или на 1 миллион? Нельзя же точно знать какой объем они будут занимать. Или можно написать скажем 1 миллиард(1 Gb) и все будет норм? Но опять таки, а если не хватит памяти или не надо столько, как быть с этим? |
| Автор: Incinerated 4.11.2010, 18:35 | ||
я все-таки не особо понял как мне нужно описать вектора мои, описав главный вот так:
вроде ничего лишнего нету, этот пример рабочий, хоть в нем и вырезаны куски, но я самое основное оставил. Т.е. когда запускаешь без параметра программа заполняет вектор и хранит его в общей памяти с таким-то названием, когда с параметром запускаешь он читает данные из этой памяти и выводит в консоль, все в принципе работает. Но возникает проблема когда я добавляю в класс, к примеру, c3 вектор класса c1. Как его нужно описать? описал как vector<c1> *v1 = new vector<c1>;, данные заносятся в вектор myvector, проверил, а вот считаться они не могут, т.е. когда запускаешь программу с параметром для считывания данных, данные класса с3, например, типа wstring считываются, а вектор v1 - пуст. Просто для меня это все ново и не понятно. Как надо было описать вектор класса с1? |
| Автор: boostcoder 4.11.2010, 18:53 | ||
покажи код. |
| Автор: Incinerated 4.11.2010, 19:08 | ||
т.е. на строчке: vector<sFile>::iterator it1 = tmp.m_files->begin(); кидает ошибку памяти... в отладке видно что вектор m_files пуст. |
| Автор: boostcoder 4.11.2010, 19:38 | ||||
уберите new. во первых - нелепо использовать new тут. во вторых - проблема по все видимости в этом. Добавлено @ 19:40
я бы это заменил на:
|
| Автор: Incinerated 4.11.2010, 21:25 | ||||||||
Почему нелепо создавать объект в конструкторе класса? И почему проблема в этом, если в этом куске кода все работает как я и писал выше:
т.е. если после цикла запустить цикл выводящий элементы вектора m_files, то он все выводит хорошо. А во 2-ом приложении вектор пуст. И каким образом инициализация вектора в конструкторе может этому мешать?
что такое аксессоры? и у вас получилось map - карта? слышал, но толком не знаю, но так как вы назвали _tree - это видимо некое дерево или граф. И получается каждая ветка имеет 2 значения wstring и вектор типа wstring и все, а мне надо больше у меня sFile имеет более 10 переменных, их все перечислять через запятую или как? и как с этим тогда работать, и почему нельзя сделать так как я написал(структура)? |
| Автор: boostcoder 4.11.2010, 21:37 | ||||
потому что -
вы пытаетесь расшарить область памяти между процессами. при этом, часть объектов которые должны быть в расшаренной памяти, создаете в локальной памяти процесса. и как в таком случае, сторонний процесс получит локальную память другого процесса? типа того. где ключ - имя каталога, а значение - список имен файлов этого каталога. это как пример. храните в векторе не строки, и ваши структуры. разницы никакой.. |
| Автор: Incinerated 4.11.2010, 21:51 | ||
Никак =) я и попытался описать вектор <sFile> как описал вектор <sDrive>, но ничего не вышло. Получается под каждый вектор m_files нужно назначать новое имя расшаренной области памяти или как? И если использовать map, то думаю возникнет еще больше вопросов |
| Автор: boostcoder 4.11.2010, 21:52 | ||
уберите new! Добавлено через 4 минуты и 19 секунд не утверждаю что проблема в этом. если не поможет - будем думать дальше. |
| Автор: Incinerated 5.11.2010, 10:01 | ||||||
убрал new... теперь вывод на экран вот такой:
если в отладке посмотреть что находится в it, то переменные wstring имеются и даже имеется какой то вектор m_files, т.е. у него пишется размер "1", т.е. там что то есть, но данные m_place и m_name ссылаются на не известные области памяти =\ получается что к ним нету доступа. Но интересно вот что, если заменить выше код на такой, то ошибку памяти не кидает, а выводит на экран пустые строки :(
|
| Автор: boostcoder 5.11.2010, 13:27 |
| опишите вложенный вектор так, как основной. и выложите компилябельный пример. |
| Автор: Incinerated 5.11.2010, 13:30 | ||||
А название области памяти ему какое писать? или просто описать вот так?
|
| Автор: Incinerated 5.11.2010, 13:50 | ||
вот компиляберный код, и даже рабочий, т.е. выводится все хорошо теперь, но вопрос у меня возник, я организовал создание вектора m_files в общей памяти и каждому новому вектору приходится давать новое имя: MyVector0,MyVector1,MyVector2 и т.д., это нормально или можно обойтись без этого как то?
|
| Автор: boostcoder 5.11.2010, 14:00 |
честно говоря...не знаю. погуглите. помоему должен быть какой-то более адекватный способ. |
| Автор: Incinerated 9.11.2010, 10:41 | ||||
столкнулся с проблемой: ругается на сериализацию вектора. В этой теме http://forum.vingrad.ru/topic-313168.html мы вроде как разобрались как это сделать, но добавив общую память компилятор стал сильно ругаться на сериализацию/десериализацию, мол:
и там еще много чего написано, если закомментировать сериализацию/десериализацию то все норм... Вот описание одного из векторов:
Как можно решить эту проблему, чтобы и в файл писалось и чтобы было в общей памяти? |
| Автор: boostcoder 9.11.2010, 13:04 |
| <boost/serialization/vector.hpp> подключен? |
| Автор: Incinerated 9.11.2010, 15:57 | ||
да |
| Автор: boostcoder 9.11.2010, 17:20 |
для этих типов сериализация реализована? Добавлено через 55 секунд несколькими постами выше, она не реализована. |
| Автор: Incinerated 9.11.2010, 20:49 | ||||||
кусок класса sDrive:
далее, объявление вектора класса sDrive:
вот, и не знаю в чем ошибка ну еще приведу запись и чтение функции:
там вызов запись и чтения заккоментен, ибо если раскомментить лезут ошибки, что описал выше... |
| Автор: Incinerated 12.11.2010, 14:28 | ||||
проблема возникла, хоть этот вариант и рабочий, но если данные на русском языке, то при чтении общей памяти вместо русских букв кракозяблы или вообще пустые строки, с английскими буквами все наоборот. А в первом приложении с русскими буквами все норм, хотя по идее в той же памяти расположены, можно эту проблему как то решить? P.S. и что с сериализацией все-таки делать? |