2

とても簡単なことをしたいのですが、それを行う簡単な方法があることを願っています!

  1. ボタンを押すだけで、ユーザー フォーム アプリケーションから外部 exe を開始します (Process.Start()たとえば、使用しますか?)。
  2. このexeが既知のファイルを生成するか、閉じるまで、アプリケーションで待機します。(この待機以外に、アプリケーションで他のアクティビティを実行する必要はありません)
  3. exeが必要なファイルを生成した場合、自動的に強制終了する必要があります(Process.Kill()おそらく使用して)

この段階で、フォーム入力はアクティブに戻るはずです。

開始された exe には、アクティブなときにユーザーが使用する独自の UI があります。これの核心は、効果的に待機することだと思います。数百ミリ秒ごとに、ファイルの出現と起動されたexeの終了を監視するタイマーループを開始できると思います。

そのとき、PC は他にほとんど何もしないでしょう。このような状況では、効率よりもシンプルさが勝ると思います。

4

5 に答える 5

4

あなたは基本的な考え方を持っています。

  1. Process.Startプロセスを開始します。
  2. Process.WaitForExitアプリケーションが完了するまでブロックします
  3. 2番目のポイントに基づいて完了するため、殺す必要はありません(上記を参照)

実行可能ファイルが実際に正常に完了しない場合は、 a を使用しFileSystemWatcherて出力ファイルの変更を監視し、出力が適切に生成されたらProcess.CloseMainWindoworを使用して終了することもできます。Process.Kill

于 2012-10-25T15:26:12.013 に答える
3

WaitForExitメソッド onを使用しProcessて、プロセスが終了するのを待つことができます。

于 2012-10-25T15:25:25.760 に答える
0

FileSystemWatcherを使用して新しいファイルを監視し、Process.Exitedイベントを探して、アプリがシャットダウンしたかどうかを確認できます。

于 2012-10-25T15:28:20.917 に答える
0

System.Diagnostics をインポートして usings に追加し、次のコードを試してください。

Process extProc = new Process();
extProc.StartInfo.FileName = "extProc.exe";
extProc.StartInfo.Arguments = "argument string";
extProc.Exited += new EventHandler(extProc_Exited);
extProc.Start();

次に、終了したイベントを処理します

private void extProc_Exited(object sender, EventArgs e)
{
     Process thisProc = (Process)sender;
     if(thisProc.ExitCode == 1)
     {
         // success
     }
     else 
     {
         // error encountered
     }
}
于 2012-10-25T15:32:44.980 に答える
0

ループなしで待機できます。「プロセス」の API には、必要なタスクを実行するための他のオプションがあります。

            var procStartInfo = new ProcessStartInfo(@"cmd", "/c " + @"ping 127.0.0.1 -n 10")
            {
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };

            var proc = new Process { StartInfo = procStartInfo };
            result = await Task<string>.Factory.StartNew(() =>
            {
                proc.Start();
                proc.WaitForExit();
                return proc.StandardOutput.ReadToEnd();
            }, TaskCreationOptions.PreferFairness);

コードは .NET 4.5 用であるため、UI は待機中に応答性を維持します。必要に応じて、.NET 4.0 を使用して単純な呼び出しで同じことを行うことができます。プロセスの実行を待機させるコード行は次のとおりです。この例では、シェル コマンドを使用して実行しています。ただし、任意の実行可能プロセスを呼び出すことができます。

「別のプロセスが使用しています」というエラーが発生しないように、「読み取り専用モード」でファイルを監視するサンプル

this.fileFullPath = filePath + @"\" + fileName;
        this.fileSystemWatcher = new FileSystemWatcher(filePath);
        this.fileSystemWatcher.Filter = fileName;
        this.fileSystemWatcher.NotifyFilter = NotifyFilters.FileName;
        this.fileSystemWatcher.Created += new FileSystemEventHandler(FileSystemWatcherCreated);
        this.fileSystemWatcher.Changed += new FileSystemEventHandler(FileSystemWatcherChanged);
        ////this.fileSystemWatcher.Error += new ErrorEventHandler(FileSystemWatcherError);
        ////this.fileSystemWatcher.Renamed += new RenamedEventHandler(FileSystemWatcherRenamed);
        ////this.fileSystemWatcher.Deleted += new FileSystemEventHandler(FileSystemWatcherDeleted);
        this.fileSystemWatcher.EnableRaisingEvents = true;

最後の行「EnableRaisingEvents」はイベント通知を実現し、「NotifyFilter」はディレクトリまたはファイルのさまざまな属性と動作を監視するのに役立ちます。

それが役立つことを願っています

于 2012-10-25T15:30:01.603 に答える