1

これは私のプロセスに関するコードです:

StreamReader outputReader = null;
StreamReader errorReader = null;


       ProcessStartInfo processStartInfo = new ProcessStartInfo(......);
       processStartInfo.ErrorDialog = false;

       //Execute the process
        Process process = new Process();
        process.StartInfo = processStartInfo;
        bool processStarted = process.Start();

                     if (processStarted)
                        {
                        //Get the output stream
                        outputReader = process.StandardOutput;
                        errorReader = process.StandardError;


                        //Display the result
                        string displayText = "Output" + Environment.NewLine + "==============" + Environment.NewLine;
                        displayText += outputReader.ReadToEnd();
                        displayText += Environment.NewLine + Environment.NewLine + "==============" +
                                       Environment.NewLine;
                        displayText += errorReader.ReadToEnd();
                        // txtResult.Text = displayText;
                    }

このプロセスの進捗率を計算するには、progressBar をフォームに追加する必要がありますが、その方法がわかりません。

私はVisual Studio 2012、Windowsフォームを使用しています。

4

2 に答える 2

3

プロセスOutputDataReceivedイベントを使用して進行状況をキャプチャします。(プロセスが何らかの更新を行っていると仮定します)。初期出力をフォーマットして増分の総数を返し、各出力イベントの進行状況をバンプするか、実際に出力データを解析して現在の進行状況を判別できます。

この例では、プロセスからの出力が最大値を設定し、後続の各ステップで最大値が増加します。

例えば

progressBar1.Style = ProgressBarStyle.Continuous;
// for every line written to stdOut, raise a progress event
int result = SpawnProcessSynchronous(fileName, args, out placeholder, false,
    (sender, eventArgs) =>
    {
        if (eventArgs.Data.StartsWith("TotalSteps=")
        {
          progressBar1.Minimum = 0;
          progressBar1.Maximum = Convert.ToInt32(eventArgs.Data.Replace("TotalSteps=",""));
          progressBar1.Value = 0;
        }
        else
        {
          progressBar1.Increment(1);
        }
    });


public static int SpawnProcessSynchronous(string fileName, string args, out string stdOut, bool isVisible, DataReceivedEventHandler OutputDataReceivedDelegate)
{
    int returnValue = 0;
    var processInfo = new ProcessStartInfo();
    stdOut = "";
    processInfo.FileName = fileName;
    processInfo.WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? "";
    log.Debug("Set working directory to: {0}", processInfo.WorkingDirectory);

    processInfo.WindowStyle = isVisible ? ProcessWindowStyle.Normal : ProcessWindowStyle.Hidden;
    processInfo.UseShellExecute = false;
    processInfo.RedirectStandardOutput = true;
    processInfo.CreateNoWindow = true;

    processInfo.Arguments = args;
    using (Process process = Process.Start(processInfo))
    {
        if (OutputDataReceivedDelegate != null)
        {
            process.OutputDataReceived += OutputDataReceivedDelegate;
            process.BeginOutputReadLine();
        }
        else
        {
            stdOut = process.StandardOutput.ReadToEnd();
        }
        // do not reverse order of synchronous read to end and WaitForExit or deadlock
        // Wait for the process to end.  
        process.WaitForExit();
        returnValue = process.ExitCode;
    }
    return returnValue;
}
于 2013-02-13T17:37:16.510 に答える
0

一般的な Process には、進行状況を通知する組み込みのメカニズムがありません。進行状況を通知し始めているプロセスのいくつかの手段を理解する必要があります。

そのプロセスを制御する場合は、標準出力または標準エラーに書き込み、

outputReader = process.StandardOutput;
errorReader = process.StandardError;

その進行状況をプログラムに読み込むように定義しました。たとえば、プロセスは標準エラーに書き込むことができます

10
31
50
99

親プロセスである readerrorReaderは、これらの個々の行を % complete として解釈する可能性があります。

子プロセスの完了率を取得する手段があれば、ProgressBarを使用してその進行状況を表示できます。

于 2013-02-12T21:57:43.863 に答える