Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заставить правильно работать ProgressBar, Он работает очень странно!!! 
:(
    Опции темы
Hobotanius
  Дата 6.11.2010, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Честно говоря меня возмущает сложившаяся ситуация. На дворе 21 век а прогресбар в виндах неуправляем! Просто обидно. Толи за криворукость майкросовтовцев, то ли за свою деревянность.

Код

                    // Если в книге есть хоть одна не пустая строка
                    // то пытаемся заполнить хранилище строками из колонок A, B, C
                    if (iRow > 0)
                    {
                        progressBar1.Minimum = 0;
                        progressBar1.Maximum = iRow+2;
                        progressBar1.Value = 0;
                        
                        for (int i = 1; i < iRow + 2; )
                        {
                            
                            /// Здесь прикладной код программы (не привожу его т.к. он м.б. любым)


                            i++;
                            textBox2.Text = (i.ToString());
                            progressBar1.Value = i;
                            progressBar1.Update();
                        }
                      }



Вот простенький код. Он выполняется по нажатию на бутон. Странность в том, как процесс отображается прогрессбаром. В результате прогрессбар заполняется плавно на одну треть!!! А потом скачком до конца. Если вместо progressBar1.Update(); написать - MessageBox.Show(""); то прогрессбар заполнится весь и соответственно выполняемому циклу (но при каждой итерации мы видим сообщение). Самое смешное что простой текстбокс при этом (без мессаджбокса) бодренько отобразит возрастающее значение i, а прогрессбар - затупит на одной трети, а потом когда операция выполнится, скачком заполнится до конца.
Что же творится? Люди добрые помогите! Как заставить его работать нормально и просто? Я даже подозреваю что всё дело в оптимизации компилятором кода... Но почему тогда текстбокс отрабатывает отображение значения i нормально?
PM MAIL   Вверх
KelTron
Дата 6.11.2010, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Попробуй вместо:
Код

progressBar1.Update();

это:
Код

Application.DoEvents();


Хотя лучше твою функцию, которая выполняет длительную работу, вынести в отдельный поток, чтобы она не вешала гуй.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Hobotanius
Дата 6.11.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



Application.DoEvents(); не дала ни какого изменения. Хотя я уже добился чего хотел, но вопрос меня всёже не отпускает и хочется знать почему так происходит.

Цитата

Хотя лучше твою функцию, которая выполняет длительную работу, вынести в отдельный поток, чтобы она не вешала гуй.


Дело похоже как раз в обратном... Немного предыстории... В проге в два этапа происходит некоторый процесс в первом из экселевского файла выбираются нужные строки. Во втором создаются файлы по шаблону с участием этих строк. Так вот похоже что первый этап происходит слишком быстро и прогресс бар неуспевает за циклом обновить свой вид. Во второй части процесса идёт сохранение файлов и он более длительный и там такой же прогрессбар таким же способом работает как надо. И первый и второй цикл выполнены идентично. А прогрессбары работают поразному!

P.S. Гуй не грузится и на системные запросы отвечает, так что дело тут в чём-то другом... И я не понимаю в чём! Вот была лафа на ассемблере - если не работает то знаешь что сам виноват! А тут непонятно что...
В результате я просто убрал один прогрессбар а после окончания первого процесса просто сообщаю сколько строк найдено... Второйпроцесс отображается как надо...

Но хочется знать почему так!
PM MAIL   Вверх
KelTron
Дата 6.11.2010, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



Цитата(Hobotanius @  6.11.2010,  15:12 Найти цитируемый пост)
Вот была лафа на ассемблере - если не работает то знаешь что сам виноват!

Уверяю тебя, тут ты тоже сам виноват..)

Цитата(Hobotanius @  6.11.2010,  15:12 Найти цитируемый пост)
Но хочется знать почему так!

Ошбика явно в том коде, которого здесь нет


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.