2009-06-11 10 views
1

私はプロセスを持っています。私は起動してうまく動作しませんが、コンソールプログラムから読み込みたいのですが、実行してから、タイマーを実行しようとしました。私のプログラムはちょうどクラッシュし、そうでないときは何も得られません。コンソールプロセスから読み取る

  startInfo= new ProcessStartInfo("cmd.exe"); 
      startInfo.Arguments ="/C uus.exe "+ arg.ToString(); 
      startInfo.RedirectStandardError = true; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.UseShellExecute = false; 
      startInfo.CreateNoWindow = true; 
      this.timer1.Enabled=true; 
      this.listBox1.Items.Clear(); 
      p= Process.Start(startInfo); 
          Application.DoEvents(); 

     void Timer1Tick(object sender, EventArgs e) 
    { 
     string str=""; 
     str=p.StandardOutput.ReadLine(); 
     if(str != null) 
     { 
      this.Text=str.ToString(); 
      this.listBox1.Items.Add(str); 
     } 
     Application.DoEvents(); 
    } 

私はこれを解決するために何をしますか?


アップデート:私は今、私のプログラムはもうクラッシュしていないベンダーの提案 を試してみましたが、また、任意のデータ

  proc.StartInfo.UseShellExecute=false; 
      proc.StartInfo.CreateNoWindow=true; 
      proc.StartInfo.RedirectStandardOutput=true; 
      proc.StartInfo.RedirectStandardError=true; 
      proc.StartInfo.FileName="uus.exe"; 
      proc.StartInfo.Arguments=arg; 
      proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(SortOutputHandler); 
      proc.Start(); 
      proc.BeginOutputReadLine(); 

    void SortOutputHandler(object o,System.Diagnostics.DataReceivedEventArgs e) 
    { 
     string str=""; 
     string str2=""; 
     str=e.Data.ToString(); 
     if(str!=null && str!="") 
     { 
      this.listBox1.Items.Add(str.ToString()); 
      this.Text=str.ToString(); 
     } 
     str2=proc.StandardOutput.ReadLine(); 
     if(str2!=null && str2!="") 
     { 
      this.lsw1.Items.Add(str2.ToString()); 
     } 
    } 

HMMをrecvieません


更新: 私はそれがあった場合には、クロススレッド操作、usualyy私のWILLEがエラーを取得していことがウィルという、それはそれを行うことはできません、教えてされているので、私は、ハンドラを変更しました。

private delegate void TextAdderDelegate(string str); 

void TextAdder(string str) 
{ 
    if(this.lsw1.InvokeRequired==true) 
    { 
     Invoke(new TextAdderDelegate(TextAdder),new object[] {str}); 
    } 
    else 
    { 
     this.lsw1.Items.Add(str); 
    } 
} 

void SortOutputHandler(object o,System.Diagnostics.DataReceivedEventArgs e) 
{ 
    string str=""; 

    if(e!=null) 
    { 
     if(e.Data!=null) 
     { 
     str=e.Data.ToString(); 
     } 
    } 
    TextAdder(str); 
} 
+0

私はまた、cmdをスローする代わりにプロセスを直接実行しようとしました –

答えて

1

問題は、1つのスレッドで実行していて、別のスレッドで実行しようとしていることです。タイマーのチックイベントを使用してバックグラウンドスレッドを作成したとき、フロントエンドのユーザー入力を持つことはできません。

あなたが達成しようとしていることの大きな図を説明した場合は、おそらくあなたを助けることができます。

その間、スレッドセーフ書き込みを作成することができます。このarticleは、さまざまなスレッドでフォームコントロールに書き込む際の問題と解決策を理解するのに役立ちます。

+0

プログラムはいくつかの引数を取るプロセスです。もしerroが実行され、closeがselftであれば、私は何をしようとしていますか?プロセスがそのタスクでどれくらいの時間が経過したかを読んでから、そのタスクを実行しないで、自分のプログラムに書き込んでください。 >>その間、Timer tickを避けて同じプロセスで読むことで、シングルスレッド化したいかもしれません。 私はプロセスを呼び出す関数を読み込もうとするべきですか? –

0

Processインスタンスを明示的に作成することができます(例:new ProcessOutputDataReceivedイベント、メソッドBeginOutputReadLine()、完了時にCancelOutputRead()を使用します。

イベントOutputDataReceivedは、すぐに別のスレッドから非同期でと呼ばれ、出力データが利用可能になります。

+0

私はあなたのソリューションを試してみましたが、問題のアップデートとして、今はクラッシュしませんが、データもまったく取得できません。また、どこにCancelOutputRead()を配置するかわかりませんでした。 –

0

「スレッドクロス例外」が発生したと仮定します。これは、フォームコントロールを別のスレッドでUIスレッドから更新しているために発生する可能性があります。

+0

いいえ、エラーメッセージはありません。 –

関連する問題