Это хороший дизайн для Java и C / D для общения? - PullRequest
2 голосов
/ 18 июня 2011

У меня есть Java-программа, в которой определенные части требуют больших вычислительных ресурсов.Я хочу сделать эту часть (которая по сути генерирует изображение в соответствии с некоторыми текстовыми данными) в C / D.(Несколько экземпляров программы C могут выполняться одновременно).

Теперь я хочу иметь возможность отслеживать ход выполнения программы C / D, поэтому java-код должен читать состояние (прогы, ошибки) программы C / D как-то.

Моя идея состоит в том, чтобы использовать переменные окружения в ОС для хранения статуса, типа «TIME_LEFT = 2h10m42s».Вопросы:

Это хорошая идея или что-то действительно плохое в этом дизайне?Существуют ли какие-либо альтернативы (с использованием сокетов, stdin / stdout и т. Д.)?

РЕДАКТИРОВАТЬ: Java работает в качестве внешнего интерфейса, поэтому код C / D должен NOT включать что-либо конкретнонаписано для Java.Код C / D - это, по сути, отдельная программа, Java (или другая) предоставляет графический интерфейс.

Ответы [ 5 ]

2 голосов
/ 18 июня 2011

Вы не можете использовать переменные среды для этого, так как вы не можете передавать переменные среды в другую программу, не устанавливая ее перед началом нового процесса. Таким образом, вы не можете запустить C-программу, которая изменяет переменные окружения, которые видит ваша родительская java-программа.

Напишите статус строки в stdout в вашей C (или D) программе и прочитайте его в вашей java программе.

2 голосов
/ 18 июня 2011

Использование переменных окружения - плохая идея.Переменные среды наследуются новыми запущенными процессами.Это не переменные типа регистра, которые вы можете просто прокачать и получить к ним доступ из любого процесса, так сказать :) Вы можете использовать JNI и продолжать проверять время, оставшееся в MS на стороне Java, или сделать так, чтобы код C / D опрашивалJava-код с оставшимся в его цикле временем (однако я предпочитаю другой путь).

0 голосов
/ 18 июня 2011

Вместо использования переменной среды используйте JNA.Это проще, чем JNI и надежный способ связи с программой.Другой подход заключается в использовании очереди сообщений, такой как ActiveMQ , для которой также доступен C API, и это открытый исходный код.Это отделит приложение.

0 голосов
/ 18 июня 2011

Я согласен с Крисом Деннеттом, что это плохая идея.Я бы избегал JNI - это потрясающий способ представить тонкие ошибки, которые приводят к сбоям в вашей JVM.

Я бы реализовал это, создав C / D HTTP-сервер, работающий на локальном хосте.Сервер принимает запрос POST к / image /, чтобы начать создание образа, длительный процесс.Этот запрос POST немедленно возвращается с токеном.Затем я получу GET / image / token, который будет возвращать либо информацию о прогрессе, либо изображение, в зависимости от того, сделано это или нет.Ваш Java-процесс может затем опросить URL GET / image / token.

0 голосов
/ 18 июня 2011

Ну, вы можете сделать наоборот. Из Java опрашивать статус выполнения. Каждые 5 секунд вызывать через JNI статус (прогресс) тяжелого выполнения.

...