3

だから私はしばらくの間この問題と戦ってきて、それを修正するために多くの異なる方法を試しましたが、できません。

基本的に、私のアプリが行うのは、Javaファイルを呼び出してデバイスにアプリケーションをロードすることです。ロードしている間、リッチテキストボックスに印刷します。次に、次のファイルに移動します。私が抱えている問題は、最初のファイルがロードされている間に、2番目のファイルがロードを試みて問題が発生することです。終了待ちを試しましたが、そうすると、出力データがリッチテキストボックスに書き込まれません。何か案は?

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");
        }

    }

以下の2つの方法は、stdoutまたはエラーをリッチテキストフィールドに書き込みます。

        //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

私はここで完全に間違っているかもしれませんが...

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

後にスペースが必要です-jar

そうでなければ、Javaはすぐに爆破されます。

于 2012-02-09T15:30:46.643 に答える
0

WaitForExitUIスレッドから呼び出しを移動しようとしています。

@Mとして。バブコックは、リッチテキストボックスの更新を保留していると述べました。

これに似た解決策が機能する可能性があります。

リストを処理する新しいスレッドを開始するように変更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 に答える
0

ここでアドバイスされているよう に、process.EnableRaisingEvents = trueを設定すると、私の場合、ブロックされたUIの問題が解決しました。

于 2014-01-30T13:35:41.047 に答える