2009-04-06 29 views
1

プロセスがいつ仕事をやめたかを調べようとしています。私はこのコードで試してきましたが、プログラムがまだ実行されていて、ファイルを処理していることに気づいていません。おそらくそれはまだ1マイクロ秒後、以下を取る事をやっているので:プロセスがアイドリングしているかどうかを確認してください。

TimeSpan startTime = m_Process.TotalProcessorTime; 
    int idleCycles = 0; 
    int iMax = Math.Max(iMinNoActivityTime/100, 5); 
    while (idleCycles < iMax) 
    { 
     Sleep(100); 
     TimeSpan curTime = m_Process.TotalProcessorTime; 
     int delta = curTime.Subtract(startTime).Milliseconds; 
     if (delta != 0) 
     { 
      idleCycles = 0; 
     } 
     else 
     { 
      idleCycles++; 
     } 
     startTime = curTime; 
    } 

これは、3000秒間と呼ばれています:プロセッサの活動なしの100ミリ秒の連続30時間ブロック。

これを実行する方法はありますか?まだ実行中の場合、アイドリングとは見えませんか?プロセスはファイルを読み取り、削除してから処理して、ディレクトリを監視することができません。

+0

プログラムはバックグラウンドスレッドまたはメインスレッドで処理していますか? –

+0

メイン(GUI)スレッドで、次のようになります。 ファイルが読み込まれ、削除され、処理されます。 明らかに削除された時点を表示できますが、ファイルが処理された時点は表示されません。そして、イベントをログに記録したり送信したりするプログラムを変更できないとします。 – Carra

答えて

1

私はここに戻ってあなたのデザインを見ます。別のプロセスがアイドル状態になっていることを確認しようとするのは、非常に堅実なアプローチのようではありません。

他のプロセスが名前付きイベントを使用して、完了したことを知らせるだけではないのはなぜですか?

1

たとえば、単純なコンソールアプリケーションなどのメイン(UI)スレッドで作業が行われていることがわかっている場合は、Process.WaitForInputIdleを使用できます。ポーリングするだけの場合は、オプションでタイムアウトパラメータを指定できます。さて、作業がバックグラウンドスレッドで行われている場合、それを検出することはできません(少なくとも厄介なハックに頼らなくても)。 GrahamSが指摘しているように、このケースではデザインを再考するのは確かです。

関連する問題