Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

01.11.2012, 23:17. Просмотров 1118. Ответов 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'у
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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?Например: у меня есть кнопка на которую повешен большой кусок кода.Мне нужно сделать так...

4
V0v1k
1159 / 983 / 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();   
 
            }   
           
        }
0
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 минут
бля!!!! повторюсь! Видимо я дурак!
0
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");
                                  }
Тогда еще одно уточнение - а это именно самая настоящая корректная реализация?
Просто очень похоже это на "закручивание гаек"
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
02.11.2012, 11:18 #5
ну это пример, иф может выглядеть и как-то так:
1) if(isAllThreadDone())
2) if(isComputationCompleted)
3) if(isComputationCompleted())
0
02.11.2012, 11:18
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 и прога долго...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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