• ベストアンサー

Runtime#proccessのwait

//Batch part RunBatch(batchName); //sleep(1000); //B-part Systems.out.println("B-part"); --------------------------------------------------------- public void RunBatch(String BatchName)throws Exception {  Process pr = null;  Runtime runtime = Runtime.getRuntime();  pr = runtime.exec("cmd.exe /c start "+BatchName);  try {    int exitCode = pr.waitFor();    if(process != null) {      process.getErrorStream().close(); process.getInputStream().close(); process.getOutputStream().close(); process.destroy(); }  } catch (Exception e) {   e.printStackTrace();  } } このままですとバッチの処理が長い場合、処理が終了する前にB-partへ 処理が移行してしまいます。 とりあえずでwaitをかけてはいるのですが、完全にバッチ処理が終了 するまでB-partへ移行させない方法はありませんでしょうか? おそらくバッチファイルから結果出力させてJAVA側でフックするとは思うのですが、具体的にどう組めばいいのかが分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.5

残念ながら、SWTもOSネイティブな機能を使うのでだめなようです。 「通常のwindow」として、  Xemacs を利用すると旨くいったようなので、 もっと適切な方法もあるかと思いますが、お知らせします。 1.まず通常のwindowを開く。      Xemacsを起動する 2.そこから、バッチ処理を起動する。      Xemacsのメニューで、[Tools]-[Shell]-[Shell]を選択し      バッチコマンドを実行する。 3.バッチ処理終了後、windowを閉じる。      Xemacsを閉じる。 ここでようやくprocess.waitFor()が終了し、今まで抑止されていたB-partへ 移行するようです。 ------------------------------------------------------------------------ 秀丸等でも類似の機能があれがそれを使えばよいわけですが、今回試したXemacs のインストールは、 http://www.xemacs.org/Download/index.htmlのFor Windows 95, 98, NT, 2000, XP: You can get the current stable version of XEmacs InnoSetup install kit (Install Now!). から XEmacs_Setup_21.4.21.exe をダウンロードしました。 ------------------------------------------------------------------------ 作成したプログラムRuntime1.java ------------------------------------------------------------------------ public class Runtime1 { public static void main(String[] args) { // Batch part String batchLauncher = "\"C:\\Program Files\\XEmacs\\XEmacs-21.4.21\\i586-pc-win32\\xemacs.exe\""; try { runBatch(batchLauncher); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // sleep(1000); // B-part System.out.println("B-part"); } static void runBatch(String batchLauncher) throws Exception { Process process = null; Runtime runtime = Runtime.getRuntime(); process = runtime.exec(batchLauncher); try { process.waitFor(); if (process != null) { process.getErrorStream().close(); process.getInputStream().close(); process.getOutputStream().close(); process.destroy(); } } catch (Exception e) { e.printStackTrace(); } } } ------------------------------------------------------------------------ バッチ処理をしている間、Runtime1は通常のwindowのおかげで 止まっていると思います。 ----------------------- たか

forgedcode
質問者

お礼

auty様 返事送れて申し訳ございません ご回答ありがとうございました。 確かにちゃんとプロセスが終了するまで待機するようになりました。 とりあえずこの処理にて運用してみます。 これは私の我侭ですがサーバマシンにはあまり入れたくなかったので 別のアプローチ法も考えています。

その他の回答 (5)

  • auty
  • ベストアンサー率58% (284/486)
回答No.6

ボタンを2つ並べて、順に実行するのはどうでしょう。 BatchLauncherjava --------------------------------------------------------------- import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; public class BatchLauncher extends JFrame { String path = "BATCHファイル名"; //   ここを変更! private static final long serialVersionUID = 1L; public BatchLauncher() { setTitle("BatchLauncher"); setSize(200, 120); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.getContentPane().setLayout(new FlowLayout()); JButton execBAT = new JButton("BATの実行"); execBAT.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onclick(); } }); this.getContentPane().add(execBAT); JButton execHello = new JButton("Helloの実行"); execHello.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onclickHello(); } }); this.getContentPane().add(execHello); setVisible(true); } public BatchLauncher(String path) { this(); this.path=path; } public void onclick() { ProcessBuilder builder = new ProcessBuilder(path); try { Process process = builder.start(); } catch (IOException e) { e.printStackTrace(); JOptionPane.showMessageDialog(this.getContentPane(), "プロセス ERROR"); } } public void onclickHello() { System.out.println("HELLO"); } public static void main(String args[]) { new BatchLauncher(); } } ---------------------------------------------------------------

  • auty
  • ベストアンサー率58% (284/486)
回答No.4

>通常のwindowを開くとはcmd.exeのことでしょうか? コマンドプロンプト以外のwindowということです。 たぶん SWTのGUIで、Program.launch(...)というのがあったと思います。 残念ながら、これでcmd.exeが起動できるか確認していません。 現在時間がなくて申し訳ありませんが、確認しだいお知らせします。

  • yuji
  • ベストアンサー率37% (64/169)
回答No.3

pr = runtime.exec("cmd.exe /c start "+BatchName); のstartをつけると、すぐ処理が抜けてしまいそうな気がするのですが どうでしょうか? pr = runtime.exec("cmd.exe /c "+BatchName); としてみてはどうでしょうか?

forgedcode
質問者

補足

回答ありがとうございます。 ご指摘の通りやってみたのですが、runtime.execから反応が返ってこなくなります。 startをつけることで起動させることができます。

  • auty
  • ベストアンサー率58% (284/486)
回答No.2

JAVADOC(Process)に、 -------------------------------------------------------------------------------------  プロセスを作成するこれらのメソッドは、特定のネイティブなプラットフォーム上の特殊な  プロセスではうまく動作しない場合があります。たとえば、... Microsoft Windows 環境で  の Win16/DOS プロセス、... ------------------------------------------------------------------------------------- とあります。これが原因とは考えられないでしょうか。 とりあえず今思いつく方法としては、 1.まず通常のwindowを開く。 2.そこから、バッチ処理を起動する。 3.バッチ処理終了後、windowを閉じる。 では、どうでしょうか。 通常のwindowならば今の方法waitFor()で、うまくいくと思います。 老婆心ながら、提示されたソースにはエラーが多いようです。 ----------------------------- たか

forgedcode
質問者

補足

回答ありがとうございます。 windowを開くとはcmd.exeのことでしょうか? そうだとして、既に開いたcmdに対してどうコマンドを転送すればよいのか… エラーが多いのは掲載するにあたり、変数名などを縮めたのですが それが全部でなかったとかだと思います。

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

ふつうはwaitFor()をそのために使いますが、なにか使えない(役に立たない)状況はありますか?

forgedcode
質問者

補足

ご回答ありがとうございます。 A.bat----------- sqlplus -s ABC/ABC@DEF@C:\SQL.Command exit ---------------- SQL.Command----- set echo off set heading off set feedback off set verify off set linesize 1000 set pagesize 0 set trimspool on spool c:\Test.csv select COL1||','||COL2 from TEMP_CSV_DATA / spool off exit ----------- 以上のようにbatファイルからsqlplusのコマンドファイルを呼び出しています。 ためしにruntimeのほうで直接A.batの内容を実行したのですが 結果は同じでした。

関連するQ&A