Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
6 / 6 / 0
Регистрация: 26.02.2010
Сообщений: 26

Значение попадает в TextBox раньше, чем полоска ProgressBar доходит до конца

01.06.2012, 08:25. Показов 2063. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил добавить к себе в проект прогресс бар, но вот незадача, почему то вычисляемое значение попадает в текст бокс раньше, чем полоска прогресс бара доходит до конца. Подскажите пожалуйста, что можно сделать.

C#
1
2
3
//вызов потока
            Thread t = new Thread(TestForm);
            this.Invoke(new ThreadStart(TestForm));

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
int THIRST, SECOND, THIRD;
        double sum;
        TimeSpan ts;
 
        private void TestForm()
        {
//вызываемая процедура в потоке         
 
            ProgressBar pb = this.progressBar1;
            pb.Value = 1;    
 
            DateTime PLAN_DATE = Convert.ToDateTime("15.04.2012");
            DateTime FACT_DATE = Convert.ToDateTime("17.04.2012");
            DateTime DOC_DATE = PLAN_DATE.AddMonths(-3);
 
            pb.Value++;          
 
 
            ts = PLAN_DATE - DOC_DATE;
            THIRST = ts.Days;
       
            pb.Value++;
            
            ts = FACT_DATE - DOC_DATE;
            SECOND = ts.Days;
 
            ts = FACT_DATE - PLAN_DATE;
            THIRD = ts.Days;
      
             pb.Value++;
         
 
            sum =sum + THIRST / (SECOND * (1 + THIRD * 0.02));
            pb.Value++;
  
            
 
            this.textBox1.Text = sum.ToString();          
       
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2012, 08:25
Ответы с готовыми решениями:

Текст на мобильных устройствах не доходит до конца блока и переносится раньше
Сайт s-vanna.ru некорректно открывается на андроиде. Текст на обычных устройствах разъезжается по всей длине центрального блока, а вот на...

Функция возвращает значение раньше, чем отработают внутренние циклы.
Здравствуйте! Подскажите кто разбирается в поточности JavaScript. Столкнулся с вещью, которую не могу объяснить. Есть такая ф-ция,...

Событие для TextBox'a выполняется раньше, чем для кнопки
есть события для кнопки private void Button1_Click(object sender, EventArgs e) и есть событие для textbox'a private void...

4
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
01.06.2012, 08:33
Так вы же не вызываете поток. А только создаете объект Thread. Чтобы запустить поток нужно вызвать метод Start класса Thread.
А то что у вас - вызов обычного делегата в основном потоке. И пока не завершится - ничего на форме не поменяется.
C#
1
2
Thread t = new Thread(TestForm);
t.Start();
PS. Из другого потока просто так не получится менять контролы формы(посыпятся ошибки во время выполнения). Нужно использовать Invoke, или другие ухищрения.
0
6 / 6 / 0
Регистрация: 26.02.2010
Сообщений: 26
01.06.2012, 08:38  [ТС]
А можете подсказать, как мне подправить, чтобы при этом я мог продолжать работать с элементами на форме?Просто если я добавлю t.Start(), вылетает exception о том, что нельзя работать с элементами не созданными в данном потоке.


Я видел решение, что там просто отключают сообщение об ошибке..но по моему это не совсем верно
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
01.06.2012, 08:40
Вот здесь есть правильное решение - Ответы на 7 самых частых вопросов по WinForms

А вообще, есть удобная обертка/реализация потока - BackgroundWorker.
В нем добавлены события, специально, для сообщения о прогрессе выполнения. На msdn примеры есть.
0
6 / 6 / 0
Регистрация: 26.02.2010
Сообщений: 26
01.06.2012, 08:53  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Вот здесь есть правильное решение - Ответы на 7 самых частых вопросов по WinForms

А вообще, есть удобная обертка/реализация потока - BackgroundWorker.
В нем добавлены события, специально, для сообщения о прогрессе выполнения. На msdn примеры есть.
Спасибо большое. Сейчас попробую почитать про BackgroundWorker, там даже увидел пример с progress barом.

Попробовал через делегаты

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
   ProgressBar pb = this.progressBar1;
            if (pb.InvokeRequired)
                pb.Invoke(new Action<int>((s) => pb.Value = s), 1);
            else
                pb.Value = 1;
 
              
 
 
            DateTime PLAN_DATE = Convert.ToDateTime("15.04.2012");
            DateTime FACT_DATE = Convert.ToDateTime("17.04.2012");
            DateTime DOC_DATE = PLAN_DATE.AddMonths(-3);
 
 
            if (pb.InvokeRequired)
                pb.Invoke(new Action<int>((s) => pb.Value = s), 2);
            else
                pb.Value++;
            
        
 
            ts = PLAN_DATE - DOC_DATE;
            THIRST = ts.Days;
 
            if (pb.InvokeRequired)
                pb.Invoke(new Action<int>((s) => pb.Value = s), 3);
            else
                pb.Value++;
            
            Thread.Sleep(0);
            
            ts = FACT_DATE - DOC_DATE;
            SECOND = ts.Days;
 
 
            ts = FACT_DATE - PLAN_DATE;
            THIRD = ts.Days;
 
            if (pb.InvokeRequired)
                pb.Invoke(new Action<int>((s) => pb.Value = s), 4);
            else
                pb.Value++;
            
             Thread.Sleep(0);
 
            sum =sum + THIRST / (SECOND * (1 + THIRD * 0.02));
            if (pb.InvokeRequired)
                pb.Invoke(new Action<int>((s) => pb.Value = s), 5);
            else
                pb.Value++;
            
            Thread.Sleep(0);
 
 
            if (textBox1.InvokeRequired)
                textBox1.Invoke(new Action<string>((s) => textBox1.Text = s), sum.ToString());
            else 
                textBox1.Text = sum.ToString();
Получился вот такой монстр. Который все равно передает текст раньше Т_Т.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2012, 08:53
Помогаю со студенческими работами здесь

полоска progressBar1 дойдёт до конца, и вывелось сообщение
как сделать так что бы когда нажал кнопку(button), полоска progressBar1 дойдёт до конца, и вывелось сообщение на экран private void...

Дефрагментация не доходит до конца
Когда делаешь дефрагментацию, всегда хочется увидеть идеальную непрерывную синюю полосу, а после неё - такую же непрерывную белую. Но, увы,...

Программа не доходит до конца
Программа не доходит до конца.В чем может быть ошибка? Иногда запрашивает ввод только а и высчитывает непонятно что #include...

Прогресбар не доходит до конца
Есть код: private void timer1_Tick(object sender, EventArgs e) { progressBar1.PerformStep(); if...

Цикл не доходит до конца
Здравствуйте! Не могу разобраться, почему цикл for не доходит до конца. Ниже я привел код, за любой ответ буду благодарен. Где keys.Count -...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru