Индикатор выполнения для внешнего процесса - PullRequest
0 голосов
/ 12 августа 2011

В настоящее время я пишу облегченную программу, которая объединяет множество командных строк и других внешних процессов в одно приложение.

В настоящее время я столкнулся с проблемой получения системной информации с помощью системной информации .

Я успешно закодировал кнопку, чтобы вызвать системный информационный процесс и перенаправить вывод в текстовое поле.

То, что я сейчас пытаюсь сделать, это иметь индикатор выполнения в нижней части моего окна WPF, поскольку для загрузки системной информации требуется время.

Поскольку я не знаю способа получения точной продолжительности от внешнего процесса, я пытаюсь использовать стиль Marquee.

Я следовал здесь примерам на stackoverflow ( Windows Forms ProgressBar: Самый простой способ запустить / остановить выделение? ), а также на других сайтах, но не смог определить, куда поместить код, чтобы индикатор выполнения прокручивался во время работы systeminfo и останавливался после его завершения.

Мой текущий код (без progressbar1.Style = ProgressBarStyle.Marquee;) указан ниже.

Будем весьма благодарны за любые предложения относительно того, где разместить код или какой синтаксис использовать. Заранее спасибо!

private void btnSystemInfo_Click(object sender, RoutedEventArgs e)
        {


            // Get system info
            Process info = new Process();
            info.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            info.StartInfo.FileName = "C:\\Windows\\system32\\systeminfo.exe";
            info.StartInfo.Arguments = "-S " + context;
            info.StartInfo.UseShellExecute = false;
            info.StartInfo.CreateNoWindow = true;
            info.StartInfo.RedirectStandardOutput = true;

            info.Start();

            string infoOutput = info.StandardOutput.ReadToEnd();
            info.WaitForExit();

            // Write to the txtInfo text box
            txtInfo.Text = "System Info: " + infoOutput;
            txtInfo.Foreground = Brushes.Black;
            txtInfo.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;

            // Switch to the info tab
            tabControl.SelectedIndex = 3;
        }

Ответы [ 2 ]

4 голосов
/ 12 августа 2011

Что вам нужно сделать, это переместить код, который собирает системную информацию, в поток BackgroundWorker и в главном потоке пользовательского интерфейса запустить выделение. Как только вы получите из потока BackgroundWorker сигнал о том, что его работа завершена, остановите выделение и отобразите информацию в текстовом поле

void ButtonClickEvent()
{
    BackgroundWorker bg = new BackgroundWorker();
    bg.DoWork += new DoWorkEventHandler(MethodToGetInfo);
    bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
    //show marquee here
    bg.RunWorkerAsync();
}

void MethodToGetInfo(Object sender, DoWorkEventArgs args)
{
    // find system info here
}

void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
{
    //this method will be called once background worker has completed it's task
    //hide the marquee
    //update the textbox

    //NOTE that this is not a UI thread so you will need BeginInvoke to execute something in the UI thread
}
0 голосов
/ 12 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...