Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/26: Рейтинг темы: голосов - 26, средняя оценка - 4.85
3 / 3 / 1
Регистрация: 17.12.2012
Сообщений: 90
1

Обновление значения элемента Progressbar во время выполнения программы

20.01.2013, 21:47. Показов 4850. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
На форме есть:
1.кнопка, запускающая загрузку файлов из Интернета с использованием webClient
2. ProgressBar, который отображает погресс загрузки (количество загружаемых файлов всегда одинаково, поэтому каждый раз к значению прогрессбара добавляется одна и та же величина)
вот код:
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
private void button1_Click(object sender, EventArgs e)
        {
            int[] type = new int[1000];
            string[] lnk = new string[1000];
            type[1] = 1;
            type[2] = 2;
            type[3] = 4;
            type[4] = 5;
            type[5] = 6;
            type[6] = 8;
            type[7] = 11;
            type[8] = 19;
            double count = 248;
            double am = 100;
            double dx = am / count;
            WebClient webClient = new WebClient();
            int i = 0, j = 1, k = 0;
            string ii = null, dir = null;
            for (i = 0; i <= 180; i += 6)
            {
                if (i < 10)
                {
                    ii = "0" + i; // строк
                    goto dwnld;
                }
                ii = Convert.ToString(i);
            dwnld:
 
 
                for (k = 1; k <= 8; k++)
                {
                    string url = @"http://www.wetterzentrale.de/pics/Rtavn" + ii + type[k] + ".png";
                    string pathh = @"S:\" + type[k] + @"\" + "Rtavn" + ii + type[k] + ".png";
 
 
                    using (WebClient Client = new WebClient())
                    {
                        Client.DownloadFile(url, pathh);
                        if (progressBar1.Value + dx <= 100)
                        {
                            progressBar1.Value = Convert.ToInt32(progressBar1.Value + dx);
                        }
                        else
                        {
                            progressBar1.Value = 100;
                        }
 
                    }
                }
 
            }
        }
Все бы ничего, но вот в чем загвоздка - при нажати на кнопку начинается загрузка файлов, но сама форма зависает и перестает реагировать на команды до окончания загрузки, соответственно прогрессбар не обновляется.
Можно как-то это исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2013, 21:47
Ответы с готовыми решениями:

Изменение значения Label во время выполнения программы
Всем привет. Есть такой вопрос. Пишу программу с использованием графической оболочки Qt. На форме...

Обновление ProgressBar во время длительной операции
Добрый вечер! У меня в цикле происходят длительные вычисления, поэтому я решил сделать вот что:...

Обновление ProgressBar-a во время загрузки SQLite DB при включении приложения
Добрый день. Моя БД обновляется довольно долго поэтому хотелось бы показать пользователю прогресс...

ProgressBar не показывает прогресс выполнения программы
Друзья, помогите разобраться с потоками! Сколько не мучаюсь, ничего не получается. Есть главная...

11
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
21.01.2013, 05:52 2
Shadow91, Осуществляйте загрузку в потоке.
0
119 / 119 / 25
Регистрация: 03.03.2010
Сообщений: 436
21.01.2013, 15:15 3
Shadow91, либо потоки,как сказано выше, либо таймер.
Пример таймера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void button1_Click(object sender, EventArgs e)
        {
 
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
        {
             if (progressBar1.Value + dx <= 100)
                        {
                            progressBar1.Value = Convert.ToInt32(progressBar1.Value + dx);
                        }
                        else
                        {
                            progressBar1.Value = 100;
                        }
            }
0
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,706
21.01.2013, 15:32 4
А таймер тут причем?
0
119 / 119 / 25
Регистрация: 03.03.2010
Сообщений: 436
21.01.2013, 15:34 5
Как вариант чтобы прогрессбар обновлялся, а не просто зависал. Костыль так сказать)
0
3462 / 2473 / 695
Регистрация: 02.08.2011
Сообщений: 6,706
21.01.2013, 15:37 6
Но выполняться то все равно будет в одном потоке, а значит виснуть. Ед. решение - вынести в другой поток.
Либо через System.Threading, либо выполнять асинхронно через делегаты.
1
119 / 119 / 25
Регистрация: 03.03.2010
Сообщений: 436
21.01.2013, 15:41 7
Точно,не подумал...Виноват)
0
3 / 3 / 1
Регистрация: 17.12.2012
Сообщений: 90
22.01.2013, 23:23  [ТС] 8
значит так: создал 5 отдельных потоков для загрузки, теперь во время ее форма не виснет. Но! Когда попробовал в каждом потоке прописать, чтобы значение прогрессбара обновлялось после каждого загруженного файла, получил ошибку: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'progressBar1' не из того потока, в котором он был создан.

Как теперь быть??


И да, IamRain, можно поподробней с:
Цитата Сообщение от IamRain Посмотреть сообщение
выполнять асинхронно через делегаты???.
0
Темная сторона .Net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
22.01.2013, 23:32 9
Цитата Сообщение от IamRain Посмотреть сообщение
Либо через System.Threading, либо выполнять асинхронно через делегаты.
Либо через милый BackGroundWarker
0
3 / 3 / 1
Регистрация: 17.12.2012
Сообщений: 90
22.01.2013, 23:47  [ТС] 10
Ребята, это все хорошо, но вы же учтите, що вас нуб слушает и мало что понимает. можно немножко вдаться в детали???

Добавлено через 6 минут
Noob.net, спасибо, это как раз то, что мне подойдет!
 Комментарий модератора 
Если какой-либо пост на форуме показался вам полезным, нажмите кнопку "Спасибо" внизу самого поста.(Правила п.3.6)
0
37 / 37 / 6
Регистрация: 06.01.2013
Сообщений: 195
23.01.2013, 03:29 11
Приветствую! я так понял ничего что бы ты понял тебе не подсказали=) ну тогда вот держи =) Правда код от сканера портов, но смысл работы с потоком такой же =)

Кликните здесь для просмотра всего текста

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
namespace ScanPort
{
    public partial class Form1 : Form
    {
        Thread t;
        int startPort;
        int endPort;
 
        public Form1()
        {
            InitializeComponent();
            progressBar.Maximum = 100;
            progressBar.Minimum = 0;
         }
 
        private void button1_Click(object sender, EventArgs e)
        {
                t = new Thread(new ThreadStart(downloadFile));
 
                t.Start();  
                addItem("Создали и запустили поток"); 
 
        }
 
        void downloadFile() // Процедура загрузки файла
        {
              try
                {
                   /////// твоя процедура закачки файла
                   /////// создаешь переменную отвечающую загрузке файла и вызываешь метод 
                   ///////valueProgress("значение прогресс бара", "максимальное возможное значение")
                }
                catch (Exception errors)
                {
                    item = String.Format("Ошибка {1} : {2}", errors.ErrorCode, errors.Message);
                    addItem(item);
                }
            }
            t.Abort();
        }
 
        private delegate void SetListBoxItem(string name);//Создаем объект типа делегат
 
        private void LoadItemsListCallBack(string item) //Создаем метод который будет вызываться делегатом
        {
            listLog.Items.Add(item); // добавляем строки в ListLog
        }
 
        public void addItem(string item) // Метод добавления строки из другого потока
        {
            if (listLog.InvokeRequired) // Проверяем в этом ли потоке находится созданный объект 
            {
                SetListBoxItem lstBoxItem = new SetListBoxItem(this.LoadItemsListCallBack); // Создаем экземпляр объекта типа делегат
                this.Invoke(lstBoxItem, new object[] { item }); // Передаем ему значение
            }
            else // Если метод вызывается в том же потоке что и объект то
            {
                listLog.Items.Add(item); // добавляем строку
            }
        }
 
        private delegate void SetProgressHandler(int value, int maxValue); //Создаем объект типа делегат 
 
        private void ProgressValue(int value, int maxValue)//Создаем метод который будет вызываться делегатом
        {
            progressBar.Maximum = maxValue;
            progressBar.Value = value;
        }
 
        public void valueProgress(int value, int maxValue) // Метод добавления строки из другого потока
        {
            if (progressBar.InvokeRequired) // Проверяем в этом ли потоке находится созданный объект 
            {
                progressBar.Invoke(new SetProgressHandler(this.ProgressValue), value, maxValue); //Создаем экземпляр обобьет типа делегат, вызываем в нем нужный метод, и передам переменные
            }
            else // Если метод вызывается в том же потоке что и объект то
            {
                progressBar.Value = value; // вызываем метод
            }
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            
            t.Abort();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            t.Abort();
        }
    }
}
0
nio
23.01.2013, 13:16     Обновление значения элемента Progressbar во время выполнения программы
  #12

Не по теме:

Цитата Сообщение от Shadow91 Посмотреть сообщение
вы же учтите, що вас нуб слушает
Цитата Сообщение от Shadow91 Посмотреть сообщение
Noob.net, спасибо
нуб нуба понимает :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2013, 13:16

Обновление поля, время выполнения
Понадобилось сделать +1 к просмотру записи. UPDATE `TABLE` SET `view` = view+1 WHERE `id` = ...

Обновление формы во время выполнения SQL запроса
Всем добрый день На главной форме в StatusBar хочу при выполнении SQL запроса устанавливать...

Как через ProgressBar отобразить время работы программы?
Подскажите, как при помощи ProgressBar отобразить время выполнения программы? Т.е. при открытии он...

Не меняется "внешность формы" (label, progressbar) во время выполнения backgroundWorker
Здравствуйте, форумчане! Скачиваю файл по FTP через backgroundWorker, и стоит счетчик который...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru