Обновление индикатора выполнения с использованием процента прогресса, отправленного процессом cmdC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Обновление индикатора выполнения с использованием процента прогресса, отправленного процессом cmd

Сообщение Anonymous »


Я новичок в оконной форме C#. Я хочу обновить индикатор выполнения в своей программе, используя стандартные выходные данные, полученные из процесса cmd.

Сначала он не позволял мне обновлять панель и выдавал ошибку невозможно получить доступ к панели из нескольких потоков. Поэтому я пошел и запустил процесс асинхронно, подключил обработчик к OutputDataReceived и использовал process.BeginOutputReadLine() для асинхронного чтения данных построчно, а также передал IProgress в обработчик, который вызовет другое событие для обновления индикатора выполнения.

Единственное, что все данные о процентах выполнения представлены в одной строке, и когда вызывается событие OutputDataReceived, индикатор выполнения процесса уже завершился и подскакивает до 100%. Как я могу обновить здесь индикатор выполнения?

Приведенный ниже код представляет собой метод, вызываемый Task.Run():

private int FlasherRun(string args, прогресс IProgress) { Отчет ProgressReportDataModel = новый(); // для сброса бара по завершении Процесс процесса = новый процесс(); ProcessStartInfo startInfo = новый ProcessStartInfo (); startInfo.FileName = programrFileName; startInfo.Arguments = args; startInfo.CreateNoWindow = правда; startInfo.RedirectStandardOutput = true; процесс.StartInfo = startInfo; процесс.OutputDataReceived += (Объект _sender, DataReceivedEventArgs _args) => FlasherOutputHandler(_sender, _args, прогресс); процесс.Начать(); процесс.BeginOutputReadLine(); процесс.WaitForExit(); // Сброс индикатора выполнения report.progressPercentageComplete = 0; прогресс.Отчет(отчет); вернуть процесс.ExitCode; } а функция ниже — это обработчик полученных данных:

private void FlasherOutputHandler(объект sendProcess, DataReceivedEventArgs outLine, IProgress прогресс) { Отчет ProgressReportDataModel = новый ProgressReportDataModel(); // извлекаем процентное значение из outLine.Data, а затем report.progressPercentageComplete = процентное значение; report.progressMessages = someMessage; прогресс.Отчет(отчет); } и обработчик событий ниже подключается к progress.ProgressChanged перед вызовом первой асинхронной функции:

private void ReportProgressEvent (объект? отправитель, ProgressReportDataModel e) { ProgressBar.Value = e.progressPercentageComplete; messagesTextBox.Text += e.progressMessages; } а вот метод, который создает экземпляр Progress и асинхронно вызывает метод FlasherRun.

private async void btn_Click(отправитель объекта, EventArgs e) { пытаться { Progress прогресс = новый Progress(); Progress.ProgressChanged += ReportProgressEvent; строка flasherCMD = "какая-то команда"; INT код выхода = 0; exitCode = await Task.Run(() => FlasherRun(flasherCMD, прогресс)); если (код выхода!= 0) { MessageBox.Show("Ошибка", "Ошибка", MessageBoxButtons.ОК, MessageBoxIcon.Error); возвращаться; } } catch (исключение-исключение) { // здесь обрабатываются исключения } } Я пробовал читать данные, поступающие из стандартного вывода, с помощью метода process.StandardOutput.Read() по одному символу и вызывать обновление прогресса, когда доступен новый процент, но это просто кажется, что он не вызывает событие обновления прогресса в процессе чтения, и после завершения чтения он вызывает средство обновления 20 раз со значением 100%, которое является последним значением, которое проходит через потоковое средство чтения.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»