2010-12-02 21 views
2

私はいくつかのオーディオファイルを変換するために一連のプロセスを起動します。プロセスが終了するまで待ってから実行を続ける - C#

 System.Diagnostics.Process process = new System.Diagnostics.Process(); 
     System.Diagnostics.ProcessStartInfo stratInfo = new System.Diagnostics.ProcessStartInfo(); 
     stratInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     DirectoryInfo di = new DirectoryInfo(@dir); 
     foreach (FileInfo fi in di.GetFiles()) 
      { 
       stratInfo.FileName = "C:\\AudioExtract.exe"; 
       stratInfo.Arguments = "-a \"" + dir + "\\" + fi.Name + "\""; 
       process.StartInfo = stratInfo; 
       process.Start(); 
      } 
       foreach (Process clsProcess in Process.GetProcesses()) 
       { 
        if (clsProcess.ProcessName.Contains("AudioExtract.exe")) 
        { 
         StatusLbl.Text = "Found!"; 
        } 
       } 

は、私はそれが実行されているかどうかを確認するために持っているもの厥、私はそれがgetprocessesの更新を継続し、それがまだ実行されているかどうかを確認し、どのように、非常にわからないイムする必要があります。

私のアプリは、ほぼ同時に、さまざまなオーディオファイルに対して同じプロセスの多くを起動します。私はコメントのリンクを見て、それはイベントハンドラを設定します、私はプロセスの1つが終了するたびに同じイベントの多くを処理する方法は?もし内部

+1

http://stackoverflow.com/question/2/how-to-know-the-exe-run-by-my-applications-process-completed-its-work/4332123#4332123 –

+0

私の投稿を更新しました – Dacto

答えて

3

、コードがあなたのメインプログラムが実行を継続することができ、あなたのforeachから壊し、その後、プロセスが終了するまで待機する

pprocess.WaitForExit(); 
break; 

http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx

を試してみてください。

+0

これは私のプログラムを停止しませんか?また、他のプロセスが完了しているので、getprocessの初期データは正確ではありませんか? – Dacto

+0

これはあなたのプログラムを停止しますが、あなたが求めていたものではありませんか?あなたは複数の "AudioExtract.exe"を起動すると言っていますか?その場合は、中断しないでください。メインプログラムへのメソッド呼び出しを行います。メインプログラムの実行が終了すると、foreachは別の "AudioExtract.exe"が見つかるまで待機し、終了するまで待ってからmainメソッドを再度呼び出すことができます。私はあなたが何を望んでいるか正確にはわからない。私が少なくとも助けてくれることを願っています。 – seekerOfKnowledge

+0

私はそれぞれどのようにそれらを見つけることを続けますか? foreachはプロセスを1回だけ実行します。 – Dacto

3

はあなたのコードが事実上使用できなくなりますいくつかの問題があり、私と一緒に裸してください:あなたがファイルを持っているよう

  1. は、できるだけ多くのプロセスを発射 - ビッグ無はできません。あなたのCPUを混雑させ、あなたのスーパーマルチコアマシンの利益を得ることができます。経験則:コアあたり最大2つのプロセス。プロセッサーはうまくいくでしょう。
  2. ディスクの断片化。一度に100個のファイルに書き込むと、ハードドライブが断片化してしまいますので、時間がかからないようにしてください。
  3. プロセスオブジェクトを再利用する:再び、悪いこと。そのようにしたい場合は、ループ内に1つのProcessインスタンスを作成し、それを何らかのListに格納します。あなたが本当に「一度にすべてを走らせる」というアイデアを持っているなら、それらを実行し、リストにそれらを保存してから、リストを繰り返して、完了するまで待ってください!
  4. プロセスを作成し、システムからプロセスリストを尋ね、それらを名前で検索する - なぜ最初にそれらを作成したのですか?

EDIT:あなたはそれを行うことができますどのように

: :

  • これを行う、foreachループで二回
  • 大きなとしてアレイを作成するには、
  • を持っているどのように多くのCPUコアを調べます
    • アレイに配置されているかどうかを判定します(いずれのプロセスもnullです)
    • もしそうなら、新しいプロセスを作成し、それを配列に入れてください。
    • もしなければ、ループ:あなたのプロセスが完了していればチェックしてください。何が行われていない場合は、(私のマジックナンバーは350です - あなたはあなた自身の選択)少しスリープ - である最初のものは、それが(配列内)nullに設定
関連する問題