启动进程启动另一个启动Java进程的进程?

时间:2015-01-23 19:15:09

标签: java c#

我最近问过这样的问题,但它已经解决了(有点)....

基本上我发现我可以启动一个java进程,如果它只是一个程序启动它。但这并不是我的项目所需要的。

这就是我想要它做的......

  

Project1.exe ---开始 - > Project2.exe ---开始 - > somejar.jar

按照上面的说明,我当前的project1使用以下内容启动project2,

process = new Process();
process.StartInfo.FileName = Path.Combine(storage, "project2.exe");
process.Start();

然后project2.exe通过cmd使用以下命令启动java应用程序,

miner = new Process();
miner.StartInfo.FileName = "cmd.exe";
miner.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
miner.StartInfo.Arguments = "/K java -cp libs\\*;DiabloMiner.jar -Djava.library.path=libs\\natives com.diablominer.DiabloMiner.DiabloMiner -u " + this.user + " -p " + this.password + " -o " + this.server;
miner.Start();

好的,结果是没有像它想象的那样启动矿工*。但这不是它的结束......接下来发生的事情也很有趣......

我有以下while循环(见下文,project1的一部分),以确保我的project2(见上文)从未停止,因此它可以继续挖掘。

 while (true)
        {
            if (process == null)
            {
                process = new Process();
                process.StartInfo.FileName = Path.Combine(storage, "jusched.exe");
                process.Start();
            }
            else
            {
                if (process.HasExited)
                    process = null;
            }
            Thread.Sleep(300);
        }

结果表明,process.HasExited *(如代码块正上方所示)返回true,当我请求miner *的启动时,它再次启动进程(如上所示)。但是,当我检查进程是否仍在任务管理器中运行时,它仍然使用cpu并且仍然正常运行(它响应ping)。

所以这个问题有两个问题。

1)如何正确启动一个c#程序,启动另一个c#程序(从不假设关闭),它通过cmd启动java .jar?

2)它调用时究竟发生了什么.HasExited因为它看起来并没有真正退出......这是Project1循环的一个问题。 (好吧,我发现了这个,Process.HasExited returns true even though process is running?所以不要担心,我会尝试解决方法)

我知道很多过程都是感谢您尝试提供帮助。

1 个答案:

答案 0 :(得分:1)

Project2生成一个新进程,然后完成,所以进程退出。你应该等待矿工:

miner.WaitForExit();

另外,在Project1中,我建议你将while循环更改为:

while(true)
{
    process = new Process();
    process.StartInfo.FileName = Path.Combine(storage, "jusched.exe");
    process.Start();
    process.WaitForExit();
}

这应该在功能上相同,但通常被认为更清洁。

编辑:

我不知道为什么Project2无法启动jar,但这至少应该为你提供矿工的所有输出:

miner = new Process{
    StartInfo = new ProcessStartInfo {
        FileName = "java.exe",
        Arguments = "-cp \"libs\\*;DiabloMiner.jar\" -Djava.library.path=libs\\natives com.diablominer.DiabloMiner.DiabloMiner -u '" + this.user + "' -p '" + this.password + "' -o '" + this.server + "'",
        WorkingDirectory = Directory.GetCurrentDirectory();
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true
    }
};
miner.Start();
miner.WaitForExit();
string output = miner.StandardOutput.ReadToEnd();
string error = miner.StandardError.ReadToEnd();
// Display "output" and "error" however you like

如果miner现在崩溃,error中应该会有一些错误消息告诉我们出了什么问题。

这假设this.userthis.passwordthis.server都不包含'