Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
ribastar
4 / 4 / 2
Регистрация: 29.10.2015
Сообщений: 73
#1

Почему в цикле после каждой сотой итерации не видно рез-тов обновления button1.Text ? (всё в одном потоке!)

07.11.2016, 17:35. Просмотров 178. Ответов 5
Метки нет (Все метки)

Добрый день! Подскажите, пожалуйста, есть цикл действий (допустим 1000 итераций, в каждой итерации некое действие), я хочу после каждых скольких-то итераций обновлять Text у кнопки, где будет просто отображаться процент обработанных строк (допустим каждые 10 % но это не суть).
Допустим, я не хочу применять потоки, а хочу просто в конце итерации обновить Text кнопки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
foreach (int ocid in lstReadyForUpdatedPositions)
            {
                // основное действие в итерации
                SetPositionParemeters(dcSomeDict[ocid]);
 
               // некое условие, чтобы обновлять строку после каждых 10 процентов итераций (не суть)
                _progressCount += _progressInc;
 
                if (_progressCount >= _nextProgVal)
                {
                    btnSetInfo.Text = ((int)_progressCount).ToString() + " %";
                    //MessageBox.Show(((int)_progressCount).ToString());
                    _nextProgVal += 10;
 
                }
            }
Подскажите, пожалуйста, почему я не вижу обновления текста в кнопке сразу, а только после завершения всего цикла текст кнопки становиться сразу 90%?
При этом если в коде цикла раскомментировать и вызывать дополнительно
C#
1
MessageBox.Show(((int)_progressCount).ToString());
, то после того как MessageBox выскакивает, то Текст кнопки обновляется каждые 10%.

Почему он не обновляется без этого? Ведь это же по идее линейные действия и должны идти друг за другом? А получается строка кода "btnSetInfo.Text = ((int)_progressCount).ToString() + " %";" как будто бы не даёт результатов?

Но даже если я всуну сюда запуск второго потока, то он также не обновляет данные и текст кнопки только в конце сменяется:

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
foreach (int ocid in lstReadyForUpdatedPositions)
            {
                SetPositionParemeters(dcRowsHandles[ocid]);
                _progressCount += _progressInc;
 
                if (_progressCount >= _nextProgVal)
                {
                    Thread nT = new Thread(() =>
                    {
 
                        if (btnSetInfo.InvokeRequired)
                        {
                            btnSetInfo.BeginInvoke((Action)delegate
                            {
                                btnSetInfo.Text = ((int)_progressCount).ToString() + " %";
                            });
                        }
                        else
                            btnSetInfo.Text = ((int)_progressCount).ToString() + " %";
 
                    });
                    nT.Start();
                    //MessageBox.Show(((int)_progressCount).ToString());
                    _nextProgVal += 10;
 
                }
            }
Подскажите, пожалуйста, что я не учёл и делаю не так?

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2016, 17:35
Ответы с готовыми решениями:

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

GDI+. Почему в отдельном потоке картинки сохраняются как белые прямоугольники, а в основном потоке - всё Ок?
Всем привет, делаю функцию уменьшения картинок при помощи библиотеки GDI+, в...

Сохранение текста в Edit1.Text после нажатия Button1
Здравствуйте. Облазил везде где мог, но так и не нашел то что мне нужно. Суть...

Созданную папку видно только после обновления по F5
Пытаюсь создать папку ПКМ -> Создать ->Новая папка. после этого нечего не...

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

5
nedel
588 / 588 / 345
Регистрация: 09.04.2014
Сообщений: 1,397
Завершенные тесты: 1
07.11.2016, 18:27 #2
Цитата Сообщение от ribastar Посмотреть сообщение
почему я не вижу обновления текста в кнопке сразу, а только после завершения всего цикла текст кнопки становиться сразу 90%?
Ваша кнопка просто не успевает перерисовать себя, ведь поток занят обработкой вашего цикла.

Цитата Сообщение от ribastar Посмотреть сообщение
Но даже если я всуну сюда запуск второго потока
Вы его "не туда всовываете". В другом потоке должен обрабатываться ваш цикл, а обновление текста через BeginInvoke будет совершаться в главном потоке
0
ribastar
4 / 4 / 2
Регистрация: 29.10.2015
Сообщений: 73
07.11.2016, 18:53  [ТС] #3
Цитата Сообщение от nedel Посмотреть сообщение
Ваша кнопка просто не успевает перерисовать себя, ведь поток занят обработкой вашего цикла.
Почему цикл не дожидается перерисовки кнопки? Это действие же - часть действий итерации?
Или перерисовка кнопки запускается в отдельном потоке что ли всегда по умолчанию?

Цитата Сообщение от nedel Посмотреть сообщение
Вы его "не туда всовываете". В другом потоке должен обрабатываться ваш цикл, а обновление текста через BeginInvoke будет совершаться в главном потоке
Согласен, я бы так и поступил изначально, но теперь слишком много надо будет править, чтобы так поступить....
0
ViterAlex
6391 / 3595 / 1478
Регистрация: 11.02.2013
Сообщений: 7,919
Завершенные тесты: 3
07.11.2016, 19:03 #4
Цитата Сообщение от ribastar Посмотреть сообщение
но теперь слишком много надо будет править, чтобы так поступить....
А если это сделать позже, то править придётся ещё больше. Весь цикл должен быть в другом потоке. Отсюда и пляши
0
TopLayer
729 / 554 / 293
Регистрация: 23.10.2016
Сообщений: 1,308
Завершенные тесты: 7
07.11.2016, 19:08 #5
Цитата Сообщение от ribastar Посмотреть сообщение
Это действие же - часть действий итерации
Часть итерации - это смена текста кнопки, а не её прорисовка.
Представляйте работу своей формы как очередь методов, в которую Windows сама вставляет методы: периодически она вставляет метод прорисовки, а если нажимается кнопка, то еще и ваш обработчик этого события. Таким образом, работа формы выглядит так:
<прорисовка> <прорисовка> <Ваш метод> <прорисовка> <прорисовка>, то есть третья прорисовка не случится пока Ваш метод не отработает полностью.
0
ribastar
4 / 4 / 2
Регистрация: 29.10.2015
Сообщений: 73
07.11.2016, 20:13  [ТС] #6
Просто я думал, что прорисовка также происходит и в момент срабатывания события смены текста, то есть
<прорисовка> <прорисовка> <Ваш метод<button.Text = "..."<прорисовка>>> <прорисовка>

А так, да, наверное все же лучше поменять потоки местами тогда, но уже просто интересно
можно ли принудительно вызвать прорисовку контрола или всей формы в произвольное время в произвольном месте? Или нет такой команды?
0
07.11.2016, 20:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2016, 20:13

Почему в одном background потоке можно обращаться к View-элементам а в другом нет?
Раньше я всегда думал, что в любом потоке, кроме UI, использовать или...

Почему на каждой итерации элементы всех структур переписываются новыми?
Я полагал, что коллекция theSupplies будет хранить структуры, и на каждой...

После обновления до Windows 10 хочу вернуть всё как было
Добрый день, может кто и мне поможет вернуть все как было, после обновления до...


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

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

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