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

BackGroundWorker в связке с ProgressBar работают некорректно

05.08.2012, 20:12. Показов 4441. Ответов 6
Метки нет (Все метки)

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

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

Далее еще интереснее. Если между двумя кусками вычислений вставлю какую-то ерунду типа

C#
1
2
           ProgressBarAsync  p = new ProgressBarAsync("W1", Work_1);
            p.ShowDialog();
Где Work_1 это

C#
1
2
3
4
5
6
7
8
9
      private void Work_1(object sender, DoWorkEventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
                Thread.Sleep(10);
                ((BackgroundWorker)sender).ReportProgress(i);
 
            }
        }
то повисает именно эта ерунда, т.е. вторая по счету задача. Закрываю ее крестом, второй кусок вычислений оживает и все дальше едет.

В приаттаченом солюшине все работает. В реальном проекте с вычислениями - нет.

Что происходит ?

tst.zip
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2012, 20:12
Ответы с готовыми решениями:

ProgressBar and BackgroundWorker
Можно ли сделать так, что бы во время сортировки списка, в отдельном потоке заполнялся progressBar (на месте кнопки). Реализовал как...

ProgressBar и BackgroundWorker
Доброго времени суток. Пишу прогу, которая просматривает селениумом ссылки на странице, закидывает нужные из них в лист, потом по этому...

ProgressBar как BackgroundWorker
Есть код алгоритма сортировки, реализованный на WF, в который никак не могу понять куда можно вставить ProgressBar. Идея такова что при...

6
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
06.08.2012, 04:32
Цитата Сообщение от grv Посмотреть сообщение
По кнопке в обработчике
На код обработчика взглянуть можно?
0
2 / 2 / 0
Регистрация: 05.01.2011
Сообщений: 16
06.08.2012, 20:04  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
На код обработчика взглянуть можно?
Может это о чем то скажет, все вычисления идут вокруг статического класса Data- там все массивы, переменные и т.д.



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
        private void toolopen_Click(object sender, EventArgs e)
        {
            OpenClick2();
        }
 
 
 
 
        private void OpenClick2()
        {
            
            
            OpenFile z = new OpenFile();
            if (z.ShowDialog() == DialogResult.OK)
            {
                StatusPrimaryFile.Text = "Первичный файл: " + Data.PrimaryFile;
                StatusSecondaryFile.Text = "Вторичный файл: " + Data.SecondaryFile;
                // Здесь нужно читать файл +  заполнять input-массивы.
                ModelTaho.PathData = Data.PathData;
                int ii = ModelTaho.LoadFile(Data.PrimaryFile);
                if (ii == 1)
                {
                    MessageBox.Show("Ошибка преобразования имени файла: неправильный формат.",
                                       "Сообщение об ошибке", MessageBoxButtons.OK,
                                       MessageBoxIcon.Error,
                                       MessageBoxDefaultButton.Button1,
                                       0, true
                                       );
                    goto ex;
 
 
                }
                else if (ii == 2)
                {
                    //MessageBox.Show("Ошибка открытия файла", "Ошибка");
                    goto ex;
                }
                else if (ii == 3)
                {
                    MessageBox.Show("Ошибка открытия файла", "Ошибка");
                    goto ex;
                }
 
 
                ProgressBarAsync  pba = new ProgressBarAsync("Алгоритм Бергера",ModelTaho.Process_Berger );
                pba.ShowDialog();
 
                ModelTaho.Process_FindSizeForWindowProcess();
                
                //ModelTaho.Process_Window();
                ProgressBarAsync pba1 = new ProgressBarAsync("Алгоритм скользящее окно", ModelTaho.Process_Window);
                pba1.ShowDialog();
 
 
 
                
        @ex:
            ;
        }
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
07.08.2012, 08:17
Цитата Сообщение от grv Посмотреть сообщение
ProgressBarAsync
Класс идентичный примеру?

Цитата Сообщение от grv Посмотреть сообщение
ModelTaho.Process_FindSizeForWindowProce ss();
Здесь что происходит? Без этого кода проблема остается?
0
2 / 2 / 0
Регистрация: 05.01.2011
Сообщений: 16
07.08.2012, 09:10  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
Класс идентичный примеру?




Здесь что происходит? Без этого кода проблема остается?
Класс такой же , я его выдрал с рабочего проекта и сделал солюшин примера.
Не поленился, выкинул BGW, переписал на тредах (пока без поддержки прогрессбара) со стороны исполняемого куска, то же самое.
Еще такое, если входной массив большой (ну скажем 100 тыс отсчетов) - глючит Если входной массив обрезать скажем до 5 тыс - пролетает


ModelTaho.Process_FindSizeForWindowProce ss(); - это также небольшой кусочек вычислений который тоже нужно закидывать в фон и выводить прогрессбар, пока он работает в основном треде. Я пока перевел в фон только два больших по объему вычислений. Без него нельзя. его результаты исп. дальше.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.08.2012, 09:41
grv, прицепите рабочий проект - проще проблему найти будет.
Ну или в личку сбросьте, если он "не для всех".
0
2 / 2 / 0
Регистрация: 05.01.2011
Сообщений: 16
08.08.2012, 12:18  [ТС]
Включил дисасеммблер, там полная ересь. После вызова pba.ShowDialog(); программа улетает на чтение свойства BackColor другого юзерконтрола причем там молотит по кругу и уже не возвращается. Плюнул, переписал тупо - в проекте добавил форму, на ней bgw+pb. Сразу все поехало. Кому интересно вот вариант.


Форма которая вызывается модально
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
    public partial class PBA : Form
    {
        public PBA(string init_s)
        {
            InitializeComponent();
            this.Text = init_s;
 
            this.Load += new System.EventHandler(this.PBA_Load);
            this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
            this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
 
        }
 
        private void PBA_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
 
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }
 
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Close();
        }
    }


В основной проге

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                
// открываем модально окошко        
                PBA  pba = new PBA("Алгоритм Бергера");
                pba.backgroundWorker1.DoWork += ModelTaho.Process_Berger;
                pba.ShowDialog();
 
// Обновление прогрессбара в вычислениях
 
        public  void Process_Berger(object sender, DoWorkEventArgs e)
{
 
            var backgroundWorker = sender as BackgroundWorker;
            // Ну идалее выводим значения от 0 до 100 в основном цикле вычислений
            backgroundWorker.ReportProgress(55);
 
 
}
Все принимавшим участие спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.08.2012, 12:18
Помогаю со студенческими работами здесь

Обновление ProgressBar из BackgroundWorker
Вообщем так, нашёл исход с BackgroundWorker`om идвижением progressBar`a, но у меня вылазит такая ошибка: Мб, я не туда действие сую? ...

Не работает ProgressBar в BackgroundWorker
Суть программы такова - с помощью асинхронности считывать построчно файл размером 1 ГБ, и искать желаемое слово в отдельном потоке, так что...

Зависание с ProgressBar и BackgroundWorker
учу винформс, если конкретнее ProgressBar... проблема такая: изначально прогресбар невидим, после нажатия на кнопку начинает работу функция...

BackgroundWorker , progressBar и обработка кнопки
Добрый день . При нажатии на кнопку происходит цикл . internal void b_readeeprom_Click(object sender, EventArgs e) ...

Совместная работа ProgressBar и BackgroundWorker
Долгое время уже мучаюсь с этим прогресс баром, который связан с backgroundWorker'oм. Пробовал разные варианты, как это сделать, но......


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru