Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
djaba2012
0 / 0 / 0
Регистрация: 02.12.2011
Сообщений: 11
#1

Параллелизация работы с ProgressBar-ом - Программирование Android

01.11.2012, 23:17. Просмотров 1087. Ответов 4
Метки нет (Все метки)

Здравсвуйте!

Помогите пожалуйста разобраться с ProgressBar'ом.

Прочитав несколько любительских статей по параллелизации работы ProgressBar'а, в частности вот эту, эту, официальный ман - все-равно не понял как нужно правильно заставить его работать

Цель следующая - чтобы этот самый ProgressBar визуально менял свое состояние по мере того как программа совершает расчеты.

Суть проблемы (а именно необходимость использования потоков) для данной задачи я осознаю.

Чтобы вы получше поняли проблему - кусок кода:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        switch(v.getId()){
        case R.id.button1:
            for (int i = 0; i < 4; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        brown(n += 5, 0.01);
                        myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                }
                            });  
                    }
                }).start();   
 
            }   
            textview1.setText("\nComputation is completed\n");
        }


Краткое описание этого кода: нажимаю на кнопочку, в цикле создаются 4 потока в каждом из который происходит расчет функции brown() со своими параметрами, по окончанию расчета MyProgress увеличивается и компонент ProgressBar действительно визуально меняет свое состояние (т.е. каждый поток при завершении своего расчета, сигнализирует о своем завершении визуальным изменением состояния прогрессбара).
Вся беда вышеприведенного кода в том что, полагаю, первый же досчитавший поток, выходит из цикла и выводит в textview сообщение.
Т.е. в идеале и по логике (ну... в смысле я так думаю) сообщение должно быть выделено только после того как все потоки завершат свое вычисление, но получается иначе.

Если же попробовать "поиграться" с кодом, например:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                new Thread(new Runnable() {
                    public void run() {
                        for (int i = 0; i < 4; i++) {       //!!! FOR перемещен во внутрь
                            brown(n += 5, 0.01);
                            myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                }
                            }); 
                        }
                    }    
                }).start();

Сей метод также приведет к вышеописанному результату - первый же завершившийся поток выведет сообщение о завершении вычисления (в то время когда остальные потоки будут находиться в состоянии рассчета)
или
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            for (int i = 0; i < 4; i++) {
                brown(n += 5, 0.01);          //!!! вынесен вызов функции
                new Thread(new Runnable() {
                    public void run() {
                        
                            myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                }
                            }); 
                    }    
                }).start();   
            }
В этом случае "оперативного" обновления состояния ProgressBar'а не будет - когда закончится рассчет, ProgressBar моментально изменит свое состояние на 4.
Ну и так далее, про перестановку кода

Собственно вопросы - правильно ли я пытаюсь решить данную проблему? Как все-таки заставить программу работать так, чтобы дальнейший код (выдача сообщения) совершилась только после того как завершатся все потоки?
Отдельно буду благодарен за ссылку на понятный (!) ман по ProgressBar'у
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2012, 23:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Параллелизация работы с ProgressBar-ом (Программирование Android):

Параллелизация FFT на Matlab - Matlab
Доброго времени суток! Прошу помощи по такому вопросу: Есть матрица NxM, нужно посчитать Фурье в полосах вдоль одного из направлений....

Упрощение работы с progressBar - C#
Как упростить передачу прогресса выполнения программы progressBar'у, чтобы не считать количество строк кода и через строчку не вставлять...

ProgressBar для работы с архиватором - C#
Ребят, доброй ночи. Делаю архиватор, используя библиотеку SharpZipLib.Zip. Во ввремя архивации нужно отобразить процесс выполнения в...

Индикация работы программы с помощью ProgressBar - C# WPF
Всем привет. Есть wpf окно. Так же есть класс, в котором происходит куча всякой фигни. Дело в том, что фигня просиходит длительное время и...

Отобразить прогресс работы библиотеки SharpZipLib в ProgressBar - Visual Basic .NET
Как используя библиотеку SharpZipLib.Zip во время архивации отобразить процесс выполнения в ProgressBar? Заранее спасибо!

Как показать ход работы программы из progressbar - C#
Как показать ход работы программы из progressbar?Например: у меня есть кнопка на которую повешен большой кусок кода.Мне нужно сделать так...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.11.2012, 23:45 #2
Цитата Сообщение от djaba2012 Посмотреть сообщение
Вся беда вышеприведенного кода в том что, полагаю, первый же досчитавший поток, выходит из цикла и выводит в textview сообщение.
нет, это происходит сразу же после старта всех потоков.

Цитата Сообщение от djaba2012 Посмотреть сообщение
Сей метод также приведет к вышеописанному результату - первый же завершившийся поток выведет сообщение о завершении вычисления (в то время когда остальные потоки будут находиться в состоянии рассчета)
здесь вообще не видно где вы сообщение выводите


Цитата Сообщение от djaba2012 Посмотреть сообщение
В этом случае "оперативного" обновления состояния ProgressBar'а
в этом случае подсчет вообще не вынесен в поток.



Цитата Сообщение от djaba2012 Посмотреть сообщение
Как все-таки заставить программу работать так, чтобы дальнейший код (выдача сообщения) совершилась только после того как завершатся все потоки?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch(v.getId()){
        case R.id.button1:
            for (int i = 0; i < 4; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        brown(n += 5, 0.01);
                        myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                 if(myProgress == max) {
                                                  textview1.setText("\nComputation is completed\n");
                                  }
                                }
                            });  
                    }
                }).start();   
 
            }   
           
        }
mks81
7 / 7 / 0
Регистрация: 12.10.2012
Сообщений: 51
02.11.2012, 02:17 #3
Я даже вникать не стал, мысль на столько глубока, что я не могу найти себе место

Добавлено через 2 минуты
Всем спасибо!)

Добавлено через 18 минут
а вообще я вопроса не понял

Добавлено через 6 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
switch(v.getId()){
        case R.id.button1:
            for (int i = 0; i < 4; i++) {
                new Thread(new Runnable() {
                    public void run() {
                        brown(n += 5, 0.01);
                        myProgress++;                   
                        
                            mHandler.post(new Runnable() {
                                public void run() {
                                 progressBar1.setProgress(myProgress);
                                 if(myProgress == max) {
                                                  textview1.setText("\nComputation is completed\n");
                                  }
                                }
                            });  
                    }
                }).start();
бляяяя, я не знаю че делать, меня прет!!!

Добавлено через 7 минут
бля!!!! повторюсь! Видимо я дурак!
djaba2012
0 / 0 / 0
Регистрация: 02.12.2011
Сообщений: 11
02.11.2012, 06:50  [ТС] #4
Так просто?

Java
1
2
3
                                 if(myProgress == max) {
                                                  textview1.setText("\nComputation is completed\n");
                                  }
Тогда еще одно уточнение - а это именно самая настоящая корректная реализация?
Просто очень похоже это на "закручивание гаек"
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.11.2012, 11:18 #5
ну это пример, иф может выглядеть и как-то так:
1) if(isAllThreadDone())
2) if(isComputationCompleted)
3) if(isComputationCompleted())
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2012, 11:18
Привет! Вот еще темы с ответами:

ProgressBar состояние чтения файла - работы кода - C#
Доброго времени суток. Имеется код обработки richTextBox: //Анализируем открытый нами текст private void...

Отображение прогресса работы нескольких циклов в ProgressBar - Visual Basic .NET
Итак, у меня в программе несколько циклов идущих в подряд друг за другом и один прогрессбар на все. Собственно, задача в том, что каждый...

Активация работы ProgressBar при выборе CheckBox - C#
у меня есть 4 checkbox'a, кнопка, прогресс бар и textbox1. Мне нужно чтобы использую конкретное количество checkbox'ов (1,2,3,4) происходил...

ProgressBar или имитация работы пока грузиться список - C#
В общем проблема такая.Вывожу в ListView работающие процессы компа...все работает,но дело в том,что процессов у меня 75 и прога долго...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.11.2012, 11:18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru