Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
9 / 9 / 7
Регистрация: 23.12.2015
Сообщений: 941
1

На каждой итерации увеличивать значение ProgressBar-а

03.12.2017, 14:58. Показов 958. Ответов 10
Метки нет (Все метки)

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

Такой у меня конструктор:
C#
1
2
3
4
5
6
7
        MainWindow _main = null;
        public EvenSearch(MainWindow main)
        {
            InitializeComponent();
            _main = main;
            bool progressBar = _main.evenSearchProgressBar.IsEnabled = true;
        }
Задаю максимальное значение для progressBar:
C#
1
evenSearchProgressBar.Maximum = PBMax;
С каждой итерацией цикла пытаюсь увеличить значение таким образом:
C#
1
_main.evenSearchProgressBar.Value = i;
Но в данном случае progressBar заполняется только по завершении ВСЕХ итераций цикла. В чем проблема?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2017, 14:58
Ответы с готовыми решениями:

Цикл for: после каждой итерации увеличивать число
Друзья, привет! Помогите с циклом, мне нужно после каждой итерации увеличивать число, как должно...

Как вывести значение функции на каждой итерации?
помогите...как вывести значение функции на каждой итерации?..число итераций выводит, а таблицу со...

Как вернуть значение i из метода после каждой итерации в цикле
Всем привет. Давно не задавал умных вопросов // Тут без комментариев Но...

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

10
Администратор
Эксперт .NET
13849 / 11224 / 4568
Регистрация: 17.03.2014
Сообщений: 22,612
Записей в блоге: 1
04.12.2017, 14:39 2
DenKG, по всей видимости вся работа делается в одном потоке. Нужно вынести длительную операцию в отдельный поток, а progressBar обновлять с помошью Dispatcher.BeginInvoke
0
9 / 9 / 7
Регистрация: 23.12.2015
Сообщений: 941
04.12.2017, 15:30  [ТС] 3
OwenGlendower, а как мне здесь правильно добавить отдельный поток?
0
Администратор
Эксперт .NET
13849 / 11224 / 4568
Регистрация: 17.03.2014
Сообщений: 22,612
Записей в блоге: 1
04.12.2017, 15:41 4
DenKG, нужно видеть весб код чтобы сказать как правильно
0
9 / 9 / 7
Регистрация: 23.12.2015
Сообщений: 941
04.12.2017, 15:48  [ТС] 5
OwenGlendower,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using info.lundin.math;
using System.Threading;
using System.Diagnostics;
 
namespace Методы
{
    public class EvenSearch : MainWindow 
    {
        MainWindow _main = null;
        Stopwatch stopWatch = new Stopwatch();
 
        public EvenSearch(MainWindow main)
        {
            InitializeComponent();
            _main = main;
            string x1 = _main.evenSearchX1ResTB.Text;
            string YF1 = _main.evenSearchFX1ResTB.Text;
            string numOfIt = _main.numOfIt.Content.ToString();
            int progressBar = Convert.ToInt32(_main.progressBar1.Value = 0); //Сильно не уверен насчет этой строчки
            string timerVal = _main.timerLB.Content.ToString();
 
            _main.progressBar1.Value = 0;
        }
 
        public double parserFunc(DoubleValue x)
        {
            //Парсер
        }
 
        private void timerTick()
        {
            //Таймер
        }
 
        public void findValue(double tolerance, double x0, int numOfItNeeded) 
        {
            //Вычисления
            if (_main.maxRadBtn.IsChecked.Value == true)
            {
                //Ищем максимум
                if (numOfItNeeded == 0)
                {
                    //Ненужный блок
                }
 
                else
                {
                    int PBMax;
                    PBMax = numOfItNeeded;
                    progressBar1.Maximum = PBMax;
                    //Ограниченное количество итераций
                    for (i = 0; i < numOfItNeeded; i++)
                    {
                        if (YF1 <= YF0)
                        {
                            x1 = x0;
                            xval1.Value = x1;
                            YF1 = YF0;
                        }
                        else
                        {
                            x0 = x1;
                            xval0.Value = x0;
                            YF0 = parserFunc(xval0);
                            x1 = x0 + tolerance;
                            xval1.Value = x1;
                            YF1 = parserFunc(xval1);
                        }
                        i++;
                        //здесь после каждой итерации должен изменяться progressBar
                    }
                }
                if (i <= 1)
                {
                    System.Windows.MessageBox.Show("Поиск максимума. Начальное значение Х было задано справа от искомой точки. Попоробуйте задать Х меньше предыдущего");
                }
            }
 
            if (_main.minRadBtn.IsChecked.Value == true)
            {
                //То же самое
            }
 
            if (_main != null)
            {
                _main.evenSearchX1ResTB.Text = x1.ToString();
                _main.evenSearchFX1ResTB.Text = YF1.ToString();
                _main.numOfIt.Content = i.ToString();
            }
        }
    }
}
0
14 / 14 / 5
Регистрация: 15.12.2014
Сообщений: 90
04.12.2017, 18:17 6
там, где у вас комментарий "//здесь после каждой итерации должен изменяться progressBar" впишите:

C#
1
2
this.Dispatcher.BeginInvoke(new Action(() => 
{_main.progressBar1.Value  = i;});
Если не помогло, то, скорее всего, итерации выполняются слишком быстро и, соответственно, анимация проходит мгновенно. Тут можно попробовать сделать паузу потока
C#
1
2
3
4
5
this.Dispatcher.BeginInvoke(new Action(() => 
{
Thread.Sleep(1);
_main.progressBar1.Value  = i;
});
1
9 / 9 / 7
Регистрация: 23.12.2015
Сообщений: 941
05.12.2017, 17:00  [ТС] 7
Msey,
Сделал так:
C#
1
2
3
4
5
6
public EvenSearch(MainWindow main)
{
            InitializeComponent();
            _main = main;
            double progressBar = main.progressBar1.Value;
}
C#
1
_main.progressBar1.Maximum = PBMax;
C#
1
2
Dispatcher.BeginInvoke(new Action(() =>
{ this._main.progressBar1.Value = i; }));
Но полоса всё равно заполняется только после выполнения всех итераций цикла
0
14 / 14 / 5
Регистрация: 15.12.2014
Сообщений: 90
05.12.2017, 17:11 8
Цитата Сообщение от DenKG Посмотреть сообщение
C#Выделить код
C#
1
2
Dispatcher.BeginInvoke(new Action(() =>
{ this._main.progressBar1.Value = i; }));
Но полоса всё равно заполняется только после выполнения всех итераций цикла
Thread.Sleep(1); Использовали?
0
9 / 9 / 7
Регистрация: 23.12.2015
Сообщений: 941
05.12.2017, 17:12  [ТС] 9
Msey, да. Такая же история.
Даже когда количество итераций 10000, комп подвисает на пару секунд, а потом всё заполняется мгновенно.
0
14 / 14 / 5
Регистрация: 15.12.2014
Сообщений: 90
05.12.2017, 17:18 10
Попробуйте Invoke вместо BeginInvoke
0
Нарушитель
3112 / 2212 / 1091
Регистрация: 14.08.2016
Сообщений: 7,574
06.12.2017, 14:20 11
так и должно быть, тут вычисления идут в GUI потоке, вот все и подвисает, а когда вычисления прошли, тогда и поток отвисает и делает что ему далее положено, отрисовывает прогрессбар
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.12.2017, 14:20

Как Насипов узнал, что в цикле максимальное значение счетчика цикла пересчитывается на каждой итерации?
Курс ведет Гилев, но они вместе с Насиповым сейчас делают этот курс. Не суть. В общем,...

Увеличивать значение переменной
Как при каждом выполнение скрипта, увеличивать значение переменной на 1? $i=1; echo $i;

Необходимо увеличивать значение h в цикле
Как решить задачу? Необходимо увеличивать значение h в цикле class Program { static...

Увеличивать записаное в таблице значение
есть запись в таблице SqLite типа Integer. как можно увеличивать записаное в таблице значение на 1....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.