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

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

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

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

01.11.2012, 23:17. Просмотров 1081. Ответов 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-ом
Посмотрите здесь:

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

Остановка ProgressBar - Программирование Android
Всем привет, суть такова: в одной активности реализован ProgressBar ( помог товарищ), при старте следующего действия, прогресс уходит и...

Цвет ProgressBar - Программирование Android
Здравствуйте. Знает кто нибудь откуда андроид берет цвет для прогрессбара? На разных устройствах разный цвет, у каждого отдельного менять...

Запустить progressbar - Программирование Android
Как запустить с побочного потока? Пробывал, ProgressDialog.show(this, &quot;Ожидание...&quot;, &quot;Подождите, операция выполняется&quot;).show(); но с...

Не получается вывести progressbar в SupportActionBar - Программирование Android
Здравствуйте! Я использую appcompat от Google, мне необходимо сделать в ActionBar, чтобы при нажать кнопки &quot;Refresh&quot; вместо стрелочек...

Радиальный ProgressBar в качестве диаграммы - Программирование Android
Здравствуйте. В общем, есть такая идея, использовать ProgressBar как диаграмму. Например, мы высчитываем процент, и выводим его в виде...

Обновление ProgressBar из основного потока - Программирование Android
Здравствуйте! Итак, имеется долго выполняющийся код , внутри которого время от времени должно обновляться значение ProgressBar. Следом...

Как сделать простой progressbar? - Программирование Android
Здравствуйте!Бродил по нету в поисках примера для RSS Reader'a.Нашел!Ссылка на пример Все работает...,но такой вопрос.Как сделать...

Объясните про параметры ProgressBar - Программирование Android
добрый день. подскажите пожалуста. что такое скорость продвижения прогресс бара, что такое единицы продвижения прогресс бара и что такое...

ProgressBar в виде фигуры человечка - Программирование Android
Здравствуйте. Подскажите как реализовать такой progressbar. Спасибо.


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.11.2012, 23:45     Параллелизация работы с ProgressBar-ом #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     Параллелизация работы с ProgressBar-ом #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  [ТС]     Параллелизация работы с ProgressBar-ом #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     Параллелизация работы с ProgressBar-ом #5
ну это пример, иф может выглядеть и как-то так:
1) if(isAllThreadDone())
2) if(isComputationCompleted)
3) if(isComputationCompleted())
Yandex
Объявления
02.11.2012, 11:18     Параллелизация работы с ProgressBar-ом
Ответ Создать тему
Опции темы

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