2011-06-17 3 views
2

私は、特定の部分が計算集約的なJavaプログラムを持っています。 C/Dでその部分(基本的にテキストデータに基づいて画像を生成する部分)を作りたいと思います。 (Cプログラムの複数のインスタンスが同時に実行されている可能性があります)。これは、JavaとC/Dが通信するための良い設計ですか?

ここで、C/Dプログラムの進行状況を追跡できるようにするため、Javaコード はC/Dプログラムの状態(処理、エラー)を何らかの形で読み取る必要があります。

私の考えは、OSの環境変数を使用して、状態を保存することです。 "TIME_LEFT = 2h10m42s"のソートです。 質問:

これはいいアイデアですか、このデザインには本当に悪いことがありますか? いくつかの選択肢がありますか(ソケット、stdin/stdout、otherを使用していますか?

EDIT:Javaはフロントエンドとして動作するため、C/Dコードはでなければなりません。には、特にJava向けに書かれたものが含まれています。 C/Dコードは本質的にスタンドアロンのプログラムであり、Java(またはその他)はGUIを提供します。

答えて

2

環境変数を使用することはできません。新しいプロセスを開始する前に、環境変数を別のプログラムと通信することができないためです。したがって、親Javaプログラムが見ることができる環境変数を変更するCプログラムを実行することはできません。

C(またはD)プログラムのstdoutに行ベースのステータスを書き込んで、Javaプログラムで読み込みます。

+0

stdin/stdoutで解決するのはかなり簡単です。 –

2

環境変数を使用することは悪い考えです。環境変数は新しい実行プロセスによって継承されます。それらはレジスタタイプの変数ではなく、どのプロセスからもアクセスしてアクセスすることができます.JNIを使​​用してJava側のMSに残っている時間をチェックしたり、C/Dコードをポーリングしたりすることができますそのループに時間が残っているJavaコード(私はしかし、他の方法を好む)。

0

Javaでは、実行状態をポーリングするために、Javaから、5秒ごとにJNI経由で大量の実行のステータス(進行状況)を呼び出すことができます。

0

これは悪い考えであると私はChris Dennettに同意します。私はJNIを避けるでしょう - それはあなたのJVMをクラッシュさせる微妙なバグを導入する素晴らしい方法です。

これは、ローカルホスト上で実行されているC/D HTTPサーバーを作成することで実装します。サーバーは、画像の作成を開始するために/ image /へのPOST要求を受け入れます。そのPOST要求はすぐにトークンを返します。私はGET/image/tokenを実行するかどうかによって進捗情報か画像を返すでしょう。 Javaプロセスは、GET/image/token URLをポーリングできます。

0

環境変数を使用する代わりに、JNAを使用します。それはJNIとプログラムと通信する信頼できる方法よりも簡単です。もう1つのアプローチは、ActiveMQのようなMessage Queueを使用することです。これにはC APIも利用でき、これはオープンソースです。アプリケーションをデカップリングします。

関連する問題