Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать на Java с оперативной памятью? 
:(
    Опции темы
erslgoeirjh
Дата 22.11.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

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



Как на Java работать с оперативной памятью? Как выделить память, записать туда какое-то строковое, байтовое или числовое значение, как сосчитать из этой области памяти строковое, байтовое или числовое значение, как обнулить и как очистить эту область памяти? Какие пакеты и какие классы из J2SE для этого стоить использовать?

PM MAIL   Вверх
Skipy
Дата 22.11.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Никак. В Java нет средств для работы с памятью. 

Есть массивы. Массивы создаются с помощью оператора new, как и обычные объекты. При обнулении ссылки на массив он попадает под сборщик мусора и память освобождается автоматически.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
erslgoeirjh
Дата 23.11.2010, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

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



Имеется две программы. Одна интерфейсная на Java (prog1), другая выполняет математические вычисления на C++ (prog2).
Программа prog1 вызывает программу prog2. Нужно передать данные из программы prog1 в программу prog2 и наоборот (не через файл). Я хочу сделать это через оперативную память. Для этого надо в программе prog1 выделить эту область, адрес её записать в текстовый файл memory.txt, потом программа prog1 запускает программу prog2, которая считывает значение из файла memory.txt. Затем в программе prog2 запускается поток (thread), который с определённой периодичностью опрашивает эту область памяти на предмет того, что туда поступило какое-то значение. При появлении этого значения в этом буфере памяти программа prog2 производит обработку этого значения.

Также и в программе prog1 можно запустить поток, который также с определённой периодичностью будет опрашивать этот буфер памяти.

Как это сделать?

PM MAIL   Вверх
Skynin
Дата 23.11.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

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



How To Write Directly to a Memory Locations In Java

Либо, написать свою реализацию прямого доступа к памяти на С++, для дальнейшего использования с помощью JNI или JNA

Более высокоуровневый вариант - prog1 и prog2 обмениваются с помощью TCP/IP, то есть нужно и в обеих программах реализовать простейший сервер/слушатель
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Connie
Дата 23.11.2010, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

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



erslgoeirjh, а нельзя программу на С++ переписать на java?
PM MAIL WWW   Вверх
erslgoeirjh
Дата 23.11.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

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



Цитата(Connie @ 23.11.2010,  09:59)
erslgoeirjh, а нельзя программу на С++ переписать на java?

Нельзя. smile

Добавлено через 5 минут и 2 секунды
Цитата(Skynin @ 23.11.2010,  09:44)
Более высокоуровневый вариант - prog1 и prog2 обмениваются с помощью TCP/IP, то есть нужно и в обеих программах реализовать простейший сервер/слушатель

А нужно ли в этом случае запускать web-сервер или же можно обойтись без него?

И ещё вопрос: иной способ передачи данных между двумя программами--это стандартные потоки ввода и вывода (stdin и stdout). Но является ли этот способ кроссплатформенным?

Дело в том, что я пришу проект (программы prog1 и prog2) для работы как под Windows, так и под Unix. (Для обеспечения кроссплатформенности программы prog2 на C++ я использую библиотеку Qt).


PM MAIL   Вверх
Skipy
Дата 23.11.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А с чем связано ограничение на использование файлов?


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Skynin
Дата 23.11.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

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



Цитата(Connie @ 23.11.2010,  09:59)

А нужно ли в этом случае запускать web-сервер или же можно обойтись без него?

Сервером и клиентом будут сами программы.
Можно разделить функции, одна из них будет серверов а другая - клиентом.

Цитата(Connie @ 23.11.2010,  09:59)
И ещё вопрос: иной способ передачи данных между двумя программами--это стандартные потоки ввода и вывода (stdin и stdout). Но является ли этот способ кроссплатформенным?

Вообще да, тоже вариант, не додумал... Насчет кроссплатформенности по идее да. Но нужно проверять, под Windows может не сработать.

Работа по TCP/IP точно будет кроссплатформенной.
Да и использование Unsafe от Sun
или своя реализация обмена через область памяти на С++ с помощью JNI.

Еще вариант, дописать в программе prog2, что на  C++ написана, блок для подключения по JNI (Java Native Interface (JNI) — стандартный механизм для запуска кода, под управлением виртуальной машины Java (JVM), который написан на языках С/С++ или Ассемблера, и скомпонован в виде динамических библиотек, позволяет не использовать статическое связывание. Это даёт возможность вызова функции С/С++ из программы на Java, и наоборот.)
Если исходники доступны, конечно.

Цитата(Connie @ 23.11.2010,  09:59)
(Для обеспечения кроссплатформенности программы prog2 на C++ я использую библиотеку Qt).

Для решения данной задачи это без разницы.

PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
jk1
Дата 24.11.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

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



Цитата

Еще вариант, дописать в программе prog2, что на  C++ написана, блок для подключения по JNI (Java Native Interface (JNI) — стандартный механизм для запуска кода, под управлением виртуальной машины Java (JVM), который написан на языках С/С++ или Ассемблера, и скомпонован в виде динамических библиотек, позволяет не использовать статическое связывание. Это даёт возможность вызова функции С/С++ из программы на Java, и наоборот.)
Если исходники доступны, конечно.


Можно также воспользоваться JNA, тогда не нужно модифицировать существующий код на C++.

Описание и примеры


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
erslgoeirjh
Дата 24.11.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 16.12.2005

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



Всем спасибо за ответы!

Как я понял, лучше всего использовать сокеты. Для этого можно запустить соответствующие потоки в программах prog1 и prog2.

В окне программы prog1 есть три кнопки: "Выполнить", "Остановить", "Завершить". При нажатии на кнопку "Выполнить" запускается программа prog2, при нажатии кнопки "Остановить" программа prog2 приостанавливается, при последующем нажатии кнопки "Выполнить" происходит продолжение работы prog2, а при нажатии кнопки "Завершить" происходит завершение работы программы prog2. Информация о том, что программе prog2 надо приостановиться, продолжить работу или завершить работу, передаётся от программы prog1 через нефайловый способ (не будут же программы prog1 и prog2 всё время опрашивать жёсткий диск). И только результаты математических вычислений, которые производит программа prog2, будут записаны в текстовой файл, который потом будет считываться программой prog1.


Это сообщение отредактировал(а) erslgoeirjh - 24.11.2010, 14:22
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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