3

所以我一直在与这个问题作斗争一段时间,并尝试了许多不同的方法来解决它,但不能。

Bascally waht 我的应用程序是调用一个 java 文件在设备上加载应用程序。在加载时将其打印到富文本框中,然后我想继续下一个文件。我遇到的问题是,在加载第一个文件时,第二个文件会尝试加载哪些案例问题。我已经尝试等待退出,但如果我这样做,那么输出数据不会被写入富文本框。有任何想法吗?

private void btnLoad_Click(object sender, EventArgs e)
    {
        rchsdtOut.Clear();
        //count the items in queue.
        var count = lstBarToLoad.Items.Count;

        if (count <= 0)
        {
            MessageBox.Show("Nothing added to the load queue");
       }
        else
       {

            String toLoad;
            for (int i=0; i < count;i++)
              {//START OF FOREACH
                 toLoad = lstBarToLoad.Items[i].Text;
                //call load method.
                  loaddPB(toLoad);      
              }//end of for.
        }//end of else.
    }//end of private

我尝试在许多不同的地方等待退出,但它似乎不起作用。

     //Method to load files on device.
    private void loaddPB(string toLoad)
    {

        process1 = new System.Diagnostics.Process();
        process1.StartInfo.UseShellExecute = false;
        process1.StartInfo.RedirectStandardOutput = true;
        process1.StartInfo.RedirectStandardError = true;
        process1.StartInfo.CreateNoWindow = true;
        process1.StartInfo.FileName = "java.exe ";

        process1.StartInfo.Arguments = "-Xmx512M -jar";
        process1.StartInfo.Arguments += toLoad;
        try
        {

                 process1.Start();
                 process1.OutputDataReceived += (s, a) => myMethod(a);
                 process1.BeginOutputReadLine();
                 process1.ErrorDataReceived += (s, a) => myErrorMethod(a);
                 process1.BeginErrorReadLine();

                 process1.WaitForExit();
        }
        catch
        {
            Console.WriteLine("error");
        }

    }

以下两种方法将标准输出或错误写入富文本字段。

        //Method to do the logging.
    private void myMethod(DataReceivedEventArgs e)
    {

            if (e.Data != null)
            {
                Action action = () => rchsdtOut.Text += "\r\n" + e.Data.ToString();
                rchsdtOut.BeginInvoke(action, null);
                Console.WriteLine(e.Data.ToString());
            }

    }//end of private

    //Method to load the error if any thrown.
    private void myErrorMethod(DataReceivedEventArgs e)
    {
        if (e.Data != null)
        {
            Action action = () => rchsdtOut.Text += "\r\n" + e.Data.ToString();
            rchsdtOut.BeginInvoke(action, null);
            Console.WriteLine(e.Data.ToString());

        }
    }//end of private

任何想法都会很棒。基本上我需要退出进程,所以我可以继续考虑 forloop 来加载下一个文件。

4

4 回答 4

6

如果您 WaitForExit,您的应用程序会阻塞(等待)直到进程退出。这意味着它无法在其 UI 线程中处理任何 Windows 消息,因此它不会更新 UI。

您需要“在后台”启动该过程,以便您的 UI 继续刷新。这可以通过以下方式完成:

  • 从单独的线程启动和监控进程,并将进度信息传回 UI 线程进行显示
  • 将事件处理程序添加到进程退出事件,或定期轮询 process.HasExited 标志,并使用它来了解第一个进程何时完成。您的事件处理程序将启动此进程,然后退出到您的主应用程序循环,以便在等待外部进程完成时正常运行。
  • 坐在繁忙的等待循环中,直到它完成,并处理应用程序事件。(请注意这一点,因为任何导致对这段代码的可重入调用的事件都可能做非常糟糕的事情。通常,如果您使用这种方法,您需要确保应用程序的其余部分在它知道的状态下“锁定”正忙于等待进程完成)。这实际上是 WaitForExit 所做的,但它也处理应用程序事件,允许 UI 保持模糊响应:

    while (!process.HasExited)  
    {  
        Application.DoEvents();  
        Thread.Sleep(100);  
    }
    
于 2012-02-09T15:31:09.920 回答
0

正如这里所建议 那样,设置 process.EnableRaisingEvents = true 解决了我的情况下被阻止的 ui 的问题。

于 2014-01-30T13:35:41.047 回答
0

我在这里可能完全错了,但是...

process1.StartInfo.Arguments = "-Xmx512M -jar";
process1.StartInfo.Arguments += toLoad;

你需要在后面有一个空格-jar

否则 Java 将立即被炸毁。

于 2012-02-09T15:30:46.643 回答
0

尝试将WaitForExit调用移出 UI 线程。

作为@M。Babcock 提到,您正在阻止富文本框的更新。

与此类似的解决方案可能有效:

修改btnLoad_Click以启动一个处理列表的新线程(这在 count > 0 分支中)

Thread thread = new Thread(new ThreadStart(LoadPbThread));
thread.Start();

然后,添加这个:

void LoadPbThread()
{
    String toLoad;
    for (int i=0; i < count;i++)
    {//START OF FOREACH
        toLoad = lstBarToLoad.Items[i].Text;
        //call load method.
        loaddPB(toLoad);      
     }//end of for.
}
于 2012-02-09T15:37:31.320 回答