做个Eclipse插件,要调起另外一个用C#写的界面程序,使用ProcessBuilder调起C#程序,通过Process的waitFor方法获取返回值,C#程序的返回值由界面上的两个按钮决定。但是中间出现了问题:首先插件调起C#程序的时候 ,C#界面没有显示出来,然后Eclipse也死在那了。有没没有帮忙分析哈原因或者具体的解决办法?

解决方案 »

  1.   

    由于eclipse在等待结果所以死在那儿等待
      

  2.   

    中间出现了问题,C#界面没能打开,也就是C#程序没能通过按钮事件来结束,除非Process异常终止掉了,否则Process的waitFor就会一直等待
      

  3.   

    我调起的那个程序界面没有显示出来呢,但是进程存在,如果我到命令行去执行参数和代码给的参数一样,那样的话,界面又可以出来。问下,这个是不是与java的什么机制有关,还是什么其他的原因。
      

  4.   

    LZ调用C#程序,应该有个机制吧。
    如果有返回值如何处理,没有的话怎么处理,超时的话怎么处理。
    如果一直没有反应,哪怕有个提示说连结错误呢,然后关闭此次连结。
      

  5.   

    大概的写法是这样的:
       Process process = new ProcessBuilder("执行程序","参数").start();
       process.getOutputStream.close();
       if(Porcess.waitFor()==0)
       {
           //执行的一些操作
       }
       else
       {
           //执行另外的一些操作
       }现在的问题是process的进程调起的程序界面无法显示,导致料Eclipse一直等待。但是在windows命令行下以相同的参数启动调用的程序,那个界面可以出来 
      

  6.   

    为什么要关闭process的输出流
    process.getOutputStream.close();
    估计是LZ的process死锁了
    javadoc文档里明确的说明了java.lang 
    类 Process
    java.lang.Object
      java.lang.Process--------------------------------------------------------------------------------public abstract class Processextends ObjectProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。Process 类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。 创建进程的方法可能无法针对某些本机平台上的特定进程很好地工作,比如,本机窗口进程,守护进程,Microsoft Windows 上的 Win16/DOS 进程,或者 shell 脚本。创建的子进程没有自己的终端或控制台。它的所有标准 io(即 stdin、stdout 和 stderr)操作都将通过三个流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父进程。父进程使用这些流来提供到子进程的输入和获得从子进程的输出。因为有些本机平台仅针对标准输入和输出流提供有限的缓冲区大小,如果读写子进程的输出流或输入流迅速出现失败,则可能导致子进程阻塞,甚至产生死锁。 当没有 Process 对象的更多引用时,不是删掉子进程,而是继续异步执行子进程。 对于带有 Process 对象的 Java 进程,没有必要异步或并发执行由 Process 对象表示的进程。 
    上面红色字体部分,所以LZ要自己根据情况去清空process的输入输出流缓存
      

  7.   

    多谢!
    不过不是这个问题,因为我写那句的时候,用多线程来读取输出流是一样的。很怪异的问题,启动程序的时候我附加到调起的进程进行调式,那个窗体又可以显示。不知道是不是Eclipse不允许那个窗体弹出模式的对象框。
      

  8.   

    该问题已经解决,主要由于Eclipse插件操作的时候窗体句柄变了,导致C#程序中无法获取正确的句柄,所以无法调起。其次应该用新线程创建线程来调起C#程序。