добавление индикатора выполнения - PullRequest
1 голос
/ 25 сентября 2011

У меня есть приложение для формы Windows, которое использует один класс (его имя Parser), у этой формы есть кнопка, и когда я нажимаю на кнопку приложения Windows, она вызывает один из методов класса анализатора.

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

Я хотел бы добавить индикатор прогресса в форму, чтобы показать прогресс (егоэто очень большой файл)

есть идеи, как это сделать?У меня в свойстве Parse class 2 есть одно для номера строки в файле, а второе - сколько строк уже проверено.

вот моя button2_Click функция

private void button2_Click(object sender, EventArgs e)
{
      if (this.textBox1 != null & this.textBox2 != null)
      {
           inst.init(this.textBox1.Text, this.textBox2.Text);
           //this.progressBar1.Show();

           inst.ParseTheFile();
           System.Windows.Forms.MessageBox.Show("Parsing finish successfully"); 
       }
}

Ответы [ 3 ]

2 голосов
/ 25 сентября 2011

Вы можете сделать:

private void button1_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem((obj) =>
    {
        var lines = File.ReadLines(@"D:\test.txt");
        var count = lines.Count();

        for(int i = 0; i < count; i++)
        {
            // some parse work
            Invoke(new Action(() =>
            {
                progressBar1.Value = (i * 100) / count;
            }));
        }
    });
}

В приведенном выше примере он просто создает фоновый поток, чтобы не блокировать поток пользовательского интерфейса, пока не будет вызван метод Invoke. Метод Invoke необходим, чтобы манипулировать с Control, владельцем которого является текущий поток. Он принимает делегата и запускает этот делегат в потоке, которому принадлежит Control.

Вы можете даже пойти так далеко, как создание параллельного цикла foreach, если для анализа строк требуется много времени. Пример:

private void button1_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem((obj) =>
    {
        var lines = File.ReadLines(@"D:\test.txt");
        var count = lines.Count();

        Parallel.For(0, count, i =>
        {
            // some parse work
            Invoke(new Action(() =>
            {
                progressBar1.Value = (i * 100) / count;
            }));
        });
    });
}
1 голос
/ 25 сентября 2011

обычно вы должны пойти дальше и написать кое-что о том, что вы уже попробовали. Так как я думаю, что вы в большей степени на начальном уровне, я бы посоветовал заглянуть в BackgroundWorker и его событие / систему ProgressChanged (Вот введение к нему).

Конечно, вы должны переместить свой ParseTheFile-код в это.

Для более продвинутых вещей есть несколько вариантов:

* * 1010 добавить параметр к ParseTheFile (например, Действие ), который используется для установки прогресса возвращает IObservable из вашего ParseTheFile, который указывает на прогресс использовать некоторую статическую службу ParseTheFile использует для индикации прогресса (не рекомендуется) ... (я уверен, что другие люди найдут намного больше вариантов)

(Обратите внимание, что для большинства этих опций требуется использовать Control.Invoke , чтобы вернуться к вашему UI-потоку для установки значения индикатора выполнения, если вы используете другой поток - и я бы посоветовал вам использовать другой нить, если файл такой большой)

Для начала я бы пошел с фоновым работником - ИМХО, это нормально, если вы не хотите использовать SOLID (дизайн / принципы) при первом запуске;)

0 голосов
/ 25 сентября 2011

Просто используйте Math для расчета процента Нравится:

//While Reading
NumOfLines++;
int Percentage = (NumOfLines * 100) / TotalLines ;
ProgressBar.Value = Percentage;

И, вероятно, поставить int.ParseTheFile (); в фоновом режиме и / или в потоке.

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