2012-04-20 17 views
0

現在、私はC#プロジェクトで作業中で、System.Diagnostic.Processクラスを使用しています。スレッドを介して開始されたプロセスを終了する

プログラムの起動時に新しいスレッドが作成され、各スレッド内で別のプロセスが開始されます。

プログラム内の設定をチェックして、各プロセスを継続するか、停止するかを確認する必要がありますが、特定のスレッドによって開始されたプロセスをどのように参照できるかわかりません。各スレッドは、プロセスが開始されたときに名前を付けましたが、私の理解はスレッドを作成し、プロセスを開始し、プロセスがまだ実行中であっても依然として出力を受け取っていてもスレッドを閉じます。

どのプロセスがどのスレッドによって開始されたかを知ることができ、そのプロセスを実行から取り消す方法がありますか。

しかし、私はこのメソッドとこのスレッド名に基づいてプロセスを停止できるように辞書を使用する方法を見ることができません。

更新 以下のリクエストは、スレッド内の各プロセスを作成するために使用しているコードです。私は、outputreceivedイベントから参照できるように、スレッドを辞書に使用していますが、プロセスを終了する必要がある場合は、それを行う方法がわかりません。

Thread worker = new Thread(new ThreadStart(() => startProducts(product.Value[0].startScript, product.Value[0].productName))); 
       worker.IsBackground = false; 
       worker.Name = product.Value[0].productName; 
       worker.Start(); 
       logging.logger(string.Format("Starting product '{0}'", product.Value[0].productName)); 

スレッドが呼び出すメソッドは次のとおりです。ここでは、各プロセスが開始されます。各プロセスは異なる名前のスレッドを持つことが保証されています。同じ名前を持つスレッドは決して2つありません。

private void startProducts(string startScript, string product) 
     { 
      Process startProductProcess = new Process(); 
      startProductProcess.StartInfo.FileName = startScript; 
      if (configManagement.productConfig[product][0].requireArguments == true) 
      { 
       startProductProcess.StartInfo.Arguments = configManagement.productConfig[product][0].arguments; 
      } 
      startProductProcess.StartInfo.UseShellExecute = false; 
      startProductProcess.StartInfo.RedirectStandardOutput = true; 
      StringBuilder processOutput = new StringBuilder(""); 
      startProductProcess.OutputDataReceived += new DataReceivedEventHandler(startProductProcess_OutputDataReceived); 
      startProductProcess.Exited += new EventHandler(startProductProcess_Exited); 
      processTag.Add(startProductProcess, product); 
      startProductProcess.Start(); 
      //Process localByName = Process.GetProcessById(startProductProcess.Id); 
      startProductProcess.BeginOutputReadLine(); 
      logging.logger(string.Format("Started {0} with: {1} {2}", product, 
       startProductProcess.StartInfo.FileName, startProductProcess.StartInfo.Arguments)); 
     } 
+2

あなたは辞書を使用して、各プロセスをStatusEnumのようなもので辞書に保存する必要があります。 – SimpleVar

+0

私は出力イベントが発生したと思うので、いくつかのコードを追加して助けてもらうでしょう – Boardy

答えて

0

なぜスレッド名を使用するのですか?あなたがこの活動をプールしていたなら、どのスレッドが特定のプロセスを実行するのか分かりません。

プロセスを管理している場合は、プロセス名、プロセスEXEパス、プロセスハンドル、プロセスの終了を待っているスレッド、ステータスの列挙型などのフィールドとプロパティを含むことができる 'managedProcess'フィールドをスレッドセーフに保つためのミューテックス、プロセスを開始して停止するメソッド - プロセスと関係のあるもの。このmanagedProcessクラスのインスタンスをコンテナに移動します。

IMHO、デバッグ以外のスレッド名は忘れてしまいます。

stop()メソッドでは、WM_CLOSEをポストすることができます(直接行うこともできますし、P/Invokeですか?)。プロセスが終了していない場合は、TerminateProcess()を呼び出します(TerminateProcessの管理対象が何であれ)。

0

個別のスレッドを使用して各プロセスを作成することによって解決される特別な必要がない限り、スレッドを使用しないでください。あなたが探しているのは、コード内の特定のプロセスを識別するユニークな方法であれば、という名前をという名前で、辞書の識別子としてスレッドに渡すことができます。

Dictionary<string, Process> processesByName = new Dictionary<string, Process>(); 
Process firstProcess = ... //Start your process 
Process secondProcess = ... //Start your process 
processesByName.Add("FirstProcessName", firstProcess); 
processesByName.Add("SecondProcessName", secondProcess); 

その後、割り当てられた名前で特定のプロセスをプルし、必要に応じてそのプロセスとやりとりすることができます。

Process process = processesByName["FirstProcessName"]; 
if (!process.HasExited) 
{ 
    process.CloseMainWindow(); 
    process.Close(); 
} 
+0

助けてくれてありがとうございますが、これは新しい処理としては機能しませんでした。どのようなプロセスが何を処理するのか分からないので、私は処理しません。 – Boardy

+0

@Boardyバックアップしましょう。 foreachループでプロセスを作成しています。各スレッドは、N個のプロセスを開始するループを持っているか、またはそれぞれが単一のプロセスを開始するN個のスレッドを生成するループですか?それぞれのプロセスは理論的には同じ名前を持っていますか_または、与えられたプロセスに固有のスレッド名ですか? –

+0

@Boardyスレッドとプロセスをどのように作成しているかを示すコードを投稿することができれば、それは良いことです。 –

関連する問題