【问题标题】:cmd java wait for processcmd java等待进程
【发布时间】:2012-07-25 11:48:20
【问题描述】:

我正在编写一个带有 Java GUI 的应用程序,它调用一些 FORTRAN 代码。我想返回一个文件 (solution.ps),该文件根据 FORTRAN 代码中的更改进行更新和编译,这些更改是在我的 ActionPerformed 方法中创建的。但是我目前的代码只是返回文件的旧版本,而不是等待 cmd 编译的更新结果。有没有办法让 cmd 在完成下一步之前等待进程运行? (直接从 cmd 运行就可以了)

我已经搜索但找不到任何东西,除了 process.waitFor() 似乎不会在正确的点暂停执行。也试过 Thread.waitFor()。

我认为这对于想要将用户输入发送到另一个程序并返回使用这些输入的编译结果的任何人都可能有用。

无论如何这里是代码,提前感谢您的帮助,我希望我能把问题弄清楚。

String[] command ={"cmd",};
        try {
            Process p = Runtime.getRuntime().exec(command); 
            new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
            new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
            PrintWriter stdin = new PrintWriter(p.getOutputStream());
            stdin.println("cd c:\\g77");     
            stdin.println("g77setup.bat");
            stdin.println("cd c:\\users\\laurence\\workspace\\areaplanner");
            stdin.println("g77 -O4 genpack.f -o genpack");
            stdin.println("genpack");
            stdin.println("5"); 
            /* 
             * The following line sets the time to run the FORTRAN code for  
             * - need to wait for this to complete before calling mpost
             */
            stdin.println("30"); 

            stdin.println("mpost solution.mp");
            stdin.println("latex solution.tex");
            stdin.println("dvips solution.dvi -o solution.ps");
            stdin.close();
            } catch(IOException e4){}

【问题讨论】:

  • 我不明白你的问题。是cmd还是java问题? 在完成下一步之前等待进程运行?下一步是什么?
  • 两者,我想。我不希望在 FORTRAN 代码运行 30 秒之前调用“mpost solution.mp”行。上面的 FORTRAN 代码运行了 30 秒,但是上面 sn-p 之后的 Java 代码返回了在上面的代码中重新编译之前的旧版本的 solution.ps。

标签: java io cmd fortran fortran77


【解决方案1】:

您只是在运行 windows shell 命令。要修复,建议先编写批处理文件并等待它完成:

String command = "cmd /c mybatchfile.bat";
Process p = Runtime.getRuntime().exec(command);
p.waitFor();

要让另一部分在第一组命令完成之前开始,您必须编写另一个批处理文件并重复上述操作。确保两个进程都在不同的线程中。

【讨论】:

  • 我一直在尝试这个,我几乎得到了一个完整的工作解决方案。这绝对是下山的路,谢谢你的帮助!
  • 没问题。随意“打勾”我的回复:)
【解决方案2】:

尝试使用waitFor,让当前线程等待进程完成工作。

Process p = Runtime.getRuntime().exec(command);
p.waitFor()

您代码中的命令不完整。并且建议使用ProcessBuilder.start() 而不是Process

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多