Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > progressBar


Автор: maxnoskov 1.12.2006, 13:17
Помогите. Есть главная форма приложения. На ней DataSet. Я заполняю DS из xml файла с помощью WriteXml. Как мне одновременно со считыванием файла открыть окно в котором будет в это время работать progressBar.

Автор: ivashkanet 1.12.2006, 13:36
maxnoskov, в чем конкретно вопрос?
Как показать окно?
Код

dialog.ShowDialog()

Или как совместить показ диалога с загрузкой?
Тогда нужно будет загрузку сделать в отдельном потоке, а потом вернуть датасет из потока

Реального прогресбара у тя не получится, но бегущая строка будет точно  smile 

Цитата(maxnoskov @  1.12.2006,  12:17 Найти цитируемый пост)
Я заполняю DS из xml файла с помощью WriteXml

А может Лоад?

Добавлено @ 13:36 
или Read?

Автор: maxnoskov 1.12.2006, 13:46
Цитата

Или как совместить показ диалога с загрузкой?

Именно совместить!
Цитата

Тогда нужно будет загрузку сделать в отдельном потоке, а потом вернуть датасет из потока

Можно пример?
Цитата

Реального прогресбара у тя не получится, но бегущая строка будет точно

А в чем разница?
Цитата

или Read?

Конечно!

Автор: ivashkanet 1.12.2006, 14:20
Цитата(maxnoskov @  1.12.2006,  12:46 Найти цитируемый пост)
А в чем разница?

Разница в том, что, по идее, когда закончится полоска должна закончиться и загрузка данных.
Но ReadXML не предоставляет информацию сколько еще осталось (строк, элементов, ...). 
Значит нельзя рассчитать время окончания, а значит придеться прогонять статусбар в цикле: закончил -- начинай сначала.
Цитата(maxnoskov @  1.12.2006,  12:46 Найти цитируемый пост)
Можно пример?

Могу идею (на реализацию времени нет).
1) Делаешь метод ThreadDo(), в котором  создаешь датасет, загружаешь его, а в конце передаешь в главное приложение.
2) Создашь диалог в котором только один прогресбар. Который сразу же запускается и гоняет полоску пока не получит информацию от формы, что датасет передали. 
3) Когда нужно загрузить данные --- запускаешь поток. а потом этот диалог
Все smile

Автор: DarkDragon 1.12.2006, 22:02
ivashkanet, делаю работу за тебяsmile

Код


private LoadFrm frm = new LoadFrm(); // твоя форма с прог баром
private DataSet ds;

private void ProcessDo()
{
   for(;;)
   {
     if (frm.progbar1.Value >= frm.progbar1.Maximum)frm.progbar1.Value = 0;
     frm.progbar1.Value++;
   }
}

private void LoadDS (string path)
{
  System.Threading.Thread thr =  new System.Threading.ThreadStart (ProcessDo);
  if (frm == null)frm = new LoadFrm(); 
  frm.Show();
  thr.Start();
  ds.ReadXML (path);
  thr.Abort();
  frm.Close();
  frm.Dispose();
}


Автор: maxnoskov 19.2.2007, 15:25
Перешел на http://forum.vingrad.ru/topic-135787/hl/maxnoskov/index.html, но реализация та же. Спасибо всем.

Автор: ivashkanet 22.2.2007, 16:20
Этот пост преследует цель "чисто похвастаться"  smile 
Ну... может еще кому-то пригодится  smile 

Понадобилось мне сегодня реализовать этот самый прогрессБар. Решил я его сделать с помощью BackgroundWorker.
И так хорошо и прозрачно он у меня получился, что я аж залюбовался  smile 

Это правда VB .Net, но суть-то понятна

Значится, из доп компонент: 
ListBox, Button, ProgressBar и BackgroundWorker
Код

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ListBox1.Items.Clear()

            Me.Enabled = False

            ToolStripProgressBar.Value = 0
            ToolStripProgressBar.Visible = True
            BackgroundWorker.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
        Dim listOfWorkCentres As List(Of String) = ProspeoInteractor.Counters.GetListOfWorkCenters()

        Dim progress As Single = 0
        Dim progressStep As Single = 100 / listOfWorkCentres.Count
        For Each workCentre As String In listOfWorkCentres
            Dim listOfRunningOperations As List(Of String) = ProspeoInteractor.Counters.GetListOfRunningOperations(workCentre)

            If listOfRunningOperations.Count > 0 Then
                BackgroundWorker.ReportProgress(0, "WorkCentre:" + workCentre)

                For Each operation As String In listOfRunningOperations
                    BackgroundWorker.ReportProgress(0, "  " + operation)
                Next
            End If

            progress += progressStep
            BackgroundWorker.ReportProgress(progress)
        Next
    End Sub

    Private Sub BackgroundWorker_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker.ProgressChanged
        If e.UserState Is Nothing Then
            ToolStripProgressBar.Value = e.ProgressPercentage
        Else
            ListBox1.Items.Add(e.UserState)
        End If
    End Sub

    Private Sub BackgroundWorker_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker.RunWorkerCompleted
        Me.Enabled = True
        ToolStripProgressBar.Visible = False
    End Sub

Автор: _Dream 23.2.2007, 19:49
немного не понял.. это ведь бегущая строка просто подучается?
а как реальный прогресс бар сделать?
PS  и хотелось бы на CS код примера ivashkanet увидеть  smile 

Автор: Idsa 23.2.2007, 20:08
Цитата(_Dream @  23.2.2007,  19:49 Найти цитируемый пост)
немного не понял.. это ведь бегущая строка просто подучается?а как реальный прогресс бар сделать?

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


Цитата(_Dream @  23.2.2007,  19:49 Найти цитируемый пост)
PS  и хотелось бы на CS код примера ivashkanet увидеть 

А случайно нет трансляторов с VB.NET на C#.NET?

Автор: ivashkanet 23.2.2007, 20:36
Цитата(_Dream @  23.2.2007,  18:49 Найти цитируемый пост)
немного не понял.. это ведь бегущая строка просто подучается?а как реальный прогресс бар сделать?

У меня и сделан реальный прогресбар.
Вся фишка в том, что здесь я знаю сколько этапов обработки у меня есть. 
Их будет ровно столько, сколько элементов будет в массиве listOfWorkCentres
В начале я вычисляю шаг с которым передвигать прогрессбар 
Код
progressStep = 100 / listOfWorkCentres.Count

(Выполненная работа = 100 (%), всего шагов listOfWorkCentres.Count)
Далее на каждом шаге (с каждым новым рабочим центром) я увеличиваю progress на этот шаг и говорю об этом основной форме
Код

progress += progressStep
BackgroundWorker.ReportProgress(progress)

Это в моей ситуации. Но что делать если вся работа состоит из одного тяжелого запроса удаленному сарверу? Тогда реальный прогрессбар (кроме, конечно, было 0, а в конце сразу стало 100) сделать, естественно, нельзя  smile 
Цитата(_Dream @  23.2.2007,  18:49 Найти цитируемый пост)
и хотелось бы на CS код примера ivashkanet увидеть

Ввиду отсутствия дома студии, перевести корректно смогу только в понедельник, но если кто-то сделает это за меня я скажу только спасибо  smile

Добавлено @ 20:38 
Цитата(Idsa @  23.2.2007,  19:08 Найти цитируемый пост)
А случайно нет трансляторов с VB.NET на C#.NET?

Есть, тот же рефлектор --- компилишь VB .Net приложение, а потом дезассемблируешь его под язык C#  smile 

Автор: ivashkanet 26.2.2007, 15:20
Как и обещал, код C#

Код

       private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            this.Enabled = false;
            toolStripProgressBar.Value = 0;
            toolStripProgressBar.Visible = true;
            backgroundWorker.RunWorkerAsync();
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            List<String> listOfWorkCentres = ProspeoInteractor.Counters.GetListOfWorkCenters();
            float progress = 0;
            float progressStep = 100 / listOfWorkCentres.Count;
            foreach (string workCentre in listOfWorkCentres)
            {
                List<String> listOfRunningOperations = ProspeoInteractor.Counters.GetListOfRunningOperations(workCentre);
                if (listOfRunningOperations.Count > 0)
                {
                    backgroundWorker.ReportProgress(0, "WorkCentre:" + workCentre);

                    foreach (string operation in listOfRunningOperations)
                        backgroundWorker.ReportProgress(0, "  " + operation);

                }
                progress += progressStep;
                backgroundWorker.ReportProgress((int)Math.Floor(progress));
            }
        }

        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (e.UserState == null)
                toolStripProgressBar.Value = e.ProgressPercentage;
            else
                listBox1.Items.Add(e.UserState);

        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.Enabled = true;
            toolStripProgressBar.Visible = false;
        }

Автор: 777Lich777 19.12.2010, 00:55
Цитата(DarkDragon @ 1.12.2006,  22:02)
ivashkanet, делаю работу за тебяsmile

Код


private LoadFrm frm = new LoadFrm(); // твоя форма с прог баром
private DataSet ds;

private void ProcessDo()
{
   for(;;)
   {
     if (frm.progbar1.Value >= frm.progbar1.Maximum)frm.progbar1.Value = 0;
     frm.progbar1.Value++;
   }
}

private void LoadDS (string path)
{
  System.Threading.Thread thr =  new System.Threading.ThreadStart (ProcessDo);
  if (frm == null)frm = new LoadFrm(); 
  frm.Show();
  thr.Start();
  ds.ReadXML (path);
  thr.Abort();
  frm.Close();
  frm.Dispose();
}

Клево сделал работу ничего не скажешь, код не рабочий.
System.Threading.Thread thr =  new System.Threading.ThreadStart (ProcessDo);
Thread и ThreadStart - несовместимые типы
если привести к одному то ругается на поток.

Автор: Certain 19.12.2010, 03:21
Код

System.Threading.Thread t = new System.Threading.Thread(ProcessDo);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)