Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
4 / 4 / 2
Регистрация: 29.10.2015
Сообщений: 76

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

07.11.2016, 17:35. Показов 1038. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2016, 17:35
Ответы с готовыми решениями:

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

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

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

5
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,098
07.11.2016, 18:27
Цитата Сообщение от ribastar Посмотреть сообщение
почему я не вижу обновления текста в кнопке сразу, а только после завершения всего цикла текст кнопки становиться сразу 90%?
Ваша кнопка просто не успевает перерисовать себя, ведь поток занят обработкой вашего цикла.

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

Цитата Сообщение от nedel Посмотреть сообщение
Вы его "не туда всовываете". В другом потоке должен обрабатываться ваш цикл, а обновление текста через BeginInvoke будет совершаться в главном потоке
Согласен, я бы так и поступил изначально, но теперь слишком много надо будет править, чтобы так поступить....
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
07.11.2016, 19:03
Цитата Сообщение от ribastar Посмотреть сообщение
но теперь слишком много надо будет править, чтобы так поступить....
А если это сделать позже, то править придётся ещё больше. Весь цикл должен быть в другом потоке. Отсюда и пляши
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
07.11.2016, 19:08
Цитата Сообщение от ribastar Посмотреть сообщение
Это действие же - часть действий итерации
Часть итерации - это смена текста кнопки, а не её прорисовка.
Представляйте работу своей формы как очередь методов, в которую Windows сама вставляет методы: периодически она вставляет метод прорисовки, а если нажимается кнопка, то еще и ваш обработчик этого события. Таким образом, работа формы выглядит так:
<прорисовка> <прорисовка> <Ваш метод> <прорисовка> <прорисовка>, то есть третья прорисовка не случится пока Ваш метод не отработает полностью.
0
4 / 4 / 2
Регистрация: 29.10.2015
Сообщений: 76
07.11.2016, 20:13  [ТС]
Просто я думал, что прорисовка также происходит и в момент срабатывания события смены текста, то есть
<прорисовка> <прорисовка> <Ваш метод<button.Text = "..."<прорисовка>>> <прорисовка>

А так, да, наверное все же лучше поменять потоки местами тогда, но уже просто интересно
можно ли принудительно вызвать прорисовку контрола или всей формы в произвольное время в произвольном месте? Или нет такой команды?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2016, 20:13
Помогаю со студенческими работами здесь

Созданную папку видно только после обновления по F5
Пытаюсь создать папку ПКМ -&gt; Создать -&gt;Новая папка. после этого нечего не происходит, нажимаю F5 папка появляется и так со всеми файлами...

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

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

Все Запросы Обрабатываются В Одном Потоке?
Есть апликуха на xPages в которой иногда производятся ресурсоёмкие подсчёты. Когда один из пользователей запускает скриптик с подсчётами...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru