![]() |
Модераторы: javastic, AntonSaburov |
![]() ![]() ![]() |
|
FiMa1 |
|
||||||||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: нет Всего: 6 |
Ребята, привет всем!
Кто-нибудь имеет рабочие реализации окна с отображением статуса выполнения некой операции? Я никак не могу добиться рабочего варианта. Мои варианты приведены ниже. Понимаю, много кода и разбираться скорее всего не захочется, интересуют ваши рабочие решения, если не жаль поделиться =) Первый вариант. В данном варианте кроме главного создается еще один поток для выполнения необходимой работы в фоне (в классе Executor). Класс Executor периодически обновляет (продвигает) отображение статуса, за которое отвечает класс StatusScreen. В целом это вполне рабочий вариант, однако есть проблема - главный поток продолжает выполнение, т.е фраза "Completed!" будет отображена за долго до окончания работы потока класса Executor. Выполнить join() для этого фонового потока Executor нельзя, т.к. вешается работа программы в принципе. Я так понимаю это из-за того, что repaint(), вызываемый в StatusScreen.updateStatus() как-то кооперирует с главным потоком, точно не знаю... main.Main.java
main.StatusScreen.java
main.Executor.java
Консольный вывод первого варианта мидлета:
Второй вариант. В этом варианте добавлен новый класс - Progress. Этот класс предоставляет методы extendProgress и getStatus. Первый - для "продвижения" статуса, второй для его получения. Два других класса - Executor (выполнение работы) и StatusScreen делят между собой объект типа Progress, обмениваясь через него информацией о текущем состоянии (статусе) выполнения работы. Поскольку работа и отображение выполняются в отдельных потоках, есть возможность использования join для временной приостановки работы основного потока, однако есть другая проблема - выполняется отображение только начального и финального состояний выполнения операций (0% и 100%) поскольку все промежуточные вызовы Status.updateStatus (и, соответственно, repaint) игнорируются (откладываются) виртуальной машиной, т.к., известно, repaint - это только просьба отрисовать что-то на экране (аналогично вызову сборщика мусора), этот просьба может проигнорирована java машиной в случае ее загрузки другими процессами. Пробовал вставлять serviceRepaints после repaint - безрезультатно. main.Main.java
main.Executor.java
main.StatusScreen.java
main.Progress
Консольный вывод второго варианта мидлета:
Смежная информация (для последователей):
Это сообщение отредактировал(а) FiMa1 - 2.4.2011, 22:24 |
||||||||||||||||||
|
|||||||||||||||||||
FiMa1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: нет Всего: 6 |
Пока ничего умней, чем ввести public static boolean isProcessingCompleted; для первого способа в классе Main (главный поток) не придумал. Соответственно, выставляю isProcessingCompleted в true в Executor.run после завершения основной работы. Ну или можно в главном потоке мониторить isAlive() для потока выполнения работы.
В любом случае способ оказался нерабочим, работает только в приведенном выше примитивном контексте. После интеграции в проект ничего не заработало и дело не в ошибочной интеграции. В проекте инициализация приведенных выше классов и отображение StatusScreen выполняется не из startApp() мидлета, а из некоего вторичного класса, в таком случае главная нитка даже и не пытается зайти в StatusScreen.paint() после вызова StatusScreen.show(), соответственно поток для выполнения работы не запускается и главная нитка навсегда падает в бесконечный цикл, ожидая там isProcessingCompleted = true. Фоновая работа - инициализация трех RMS, в одной из которых ~300 записей. Вопрос о действительно рабочих вариантах означенной задачи для меня всё ещё открыт =) Это сообщение отредактировал(а) FiMa1 - 3.4.2011, 14:37 |
|||
|
||||
PiyodaiSiyo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 31.12.2009 Репутация: 1 Всего: 2 |
рассмотрел 1 вариант, главный поток(мидлет вход startapp) создает обьект StatusScreen а и вызывает его метод show()который ставит того в дисплэй, запускается прослушка событий и первая отрисовка (обьект ведь канвас) неявно(!) метода пэинт (display.setCurrent для этого ) который ..ну и т.д.
а главный закончив с шоу() продолжает следующую директиву т.е. выводит "Completed!".если вставить перед system.out.println цикл с какой нибудь глобальной лог. переменной то надпись выйдет после окончания всех потоков, а в чем собственно вопрос ? А если экз. StatusScreen создается в экз.др класса то пропишите в конструкторе StatusScreen() в конце repaint(); и без display зачем он нужен? Да... Просмотрел в sdk3 все нормально как и в приведенном вами окне output а |
|||
|
||||
FiMa1 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: нет Всего: 6 |
По этому пункту вопросов действительно нет, так как "вставить перед system.out.println цикл с какой нибудь глобальной лог. переменной" я уже предложил во втором своем посте (может быть туманно описал замысел):
Что касается:
Здесь смысл сказанного от меня ускользает... Что вы имели в виду? Это сообщение отредактировал(а) FiMa1 - 4.4.2011, 09:13 |
||||||||
|
|||||||||
FiMa1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: нет Всего: 6 |
Пока удалено ибо написал неправильно. Думаю...
Это сообщение отредактировал(а) FiMa1 - 4.4.2011, 21:53 |
|||
|
||||
![]() ![]() ![]() |
FAQ раздела лежит здесь! |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |