forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Is MIDlet Paused :dontknow: ? (http://forum.boolean.name/showthread.php?t=2278)

@lex 04.01.2007 16:17

Is MIDlet Paused :dontknow: ?
 
Привет всем!
Хочу спросить по поводу функции IsMidletPaused. Написал такой код, который прогоняется перед каждой перерисовкой экрана:

if IsMidletPaused then
begin
while IsMidletPaused do delay(300); //Ждём пока на паузе
if (is_playing=1) then close_player; //Затем выполняем несколько действий
plp:=Playing;
Playing:=0;
Paused:=false;
end;

В итоге ничего не срабатывает, что вобщем-то очевидно ведь если Мидлет на паузе, то как он может работать?
Если ли способ отловить событие постановки и снятия с паузы?
Прога - плэер, а ему как ничему другому нужно знать, когда его заткнули и включили мелодию звонка.
Заранее всем спасибо.

Тренсфер 04.01.2007 17:32

Re: Is MIDlet Paused :dontknow: ?
 
Так ведь IsMidletPaused это логическая функция которая принимает значение истина или ложь. Например попробуй этот код:
begin
repeat
if IsMidletPaused=true then begin
setcolor(255,255,0);
FillRect(0, 0, GetWidth, GetHeight);
Repaint;
end;
until 1=2;
end.
Если поставишь на паузу экран станет жёлтым.
Твой код можно также изменить:
if IsMidletPaused=true then begin
while IsMidletPaused=true do begin
delay(300); //Ждём пока на паузе
if (is_playing=1) then close_player; //Затем выполняем несколько действий
plp:=Playing;
Playing:=0;
Paused:=false;
end;
end;

ARV 04.01.2007 18:06

Re: Is MIDlet Paused :dontknow: ?
 
На всякий случай: не обязательно в операторе IF писать IsMidletPaused=true, у @lex-а тоже правильно.
Как я понимаю, для плейера надо обнаружить приостановку мидлета и поставить плейер тоже на паузу, а выход из паузы - уж пусть пользователь чего-то там нажмет :) Т.е. достаточно чего-то такого в основном цикле рисования на дисплее:
Код:


if IsMidletPaused and (not InPause) then begin
  StopPlayer;
  InPause := true;
end;

Далее (и перед этим) используем InPause для отрисовки того, что нужно при паузе и без нее и т.п., по команде меню (например) делаем InPause := false. В начале прогри, естественно, InPause := false.

IVenoMI 05.01.2007 20:20

Re: Is MIDlet Paused :dontknow: ?
 
Если мидлет ставится на паузу каким либо телефонным ивентом вроде входящего звонка, он автоматически останавливает свое выполнение... Для задания паузы программо функциям IsMidletPaused не нужна...

ARV 05.01.2007 20:29

Re: Is MIDlet Paused :dontknow: ?
 
А тогда зачем эта функция, если она как бы никогда true не вернет (если не пауза - по естественной причине, а если мидлет остановлен - то по причине того, что функция просто не выполнится)? Думаю, что при приеме звонка мидлет продолжает работать, но в фоне, т.е. без отрисовки на экране. Чтобы за время разговора ничего там не "убежало" и нужна эта функция.

IVenoMI 06.01.2007 00:42

Re: Is MIDlet Paused :dontknow: ?
 
Такое возможно только если аппарат поддерживае резидентные мидлеты... А это встречается далеко не всегда...

ARV 06.01.2007 01:12

Re: Is MIDlet Paused :dontknow: ?
 
Тогда каким образом возможно отловить isMidletPaused=true??? Оно ведь все-таки отлавливается!

@lex 07.01.2007 11:25

Re: Is MIDlet Paused :dontknow: ?
 
В любом случае код, описанный мной прогоняется постоянно при работающем мидлете. Попробовал позвонить себе с другого тела во время проигрывания музыки и плэер этого не заметил.
Вобще моя библиотека проигрывания написана на Java, она помимо всего прочего может устанавливать громкость звучания и приостанавливать воспроизведения. Но после выхода из паузы звучание не возобновляется, но плэер говорит, что он что-то воспроизводит. Если при этом поставить его на паузу, а затем опять снять, то он начнёт нормальное проигрывание с начала трека, а если попробовать сделать что-нибудь другое, например изменить громкость, то мидлет повисает.
Короче наверное эта функция не для всех мобил, а жаль...

ARV 07.01.2007 12:22

Re: Is MIDlet Paused :dontknow: ?
 
по логике вещей IsMidletPaused должна быть для всех мобил, т.к. она напрямую связана с соответствующим методом Java MDIP. неужели тот код, который я приводил ранее, не замечает пришедшего звонка? Как только обнаружил его (звонок) - ставь плейер на паузу, тогда и будет все ок. Я вот в своей мухобойке именно так отлавливаю звонки и прочее - работает...

Piligrim 07.01.2007 14:20

Re: Is MIDlet Paused :dontknow: ?
 
IsMidletPaused просто возвращает значение переменной, которая в startApp() выставляется в False, а в pauseApp() в True.
Например на мотороле при приостановке мидлета вызывается pauseApp(), а при запуске в фоновом режиме startApp()
Мидлет в приостановленном состоянии не может что-нибудь выполнять.

ARV 07.01.2007 15:18

Re: Is MIDlet Paused :dontknow: ?
 
Не понимаю!!!
Поясните процесс обнаружения паузы примерно так: основной цикл крутится, опрашивает IsMidletPaused, тут приходит звонок и Java-машина.... дальше продолжите вплоть до момента, когда мидлет снова запускается

Piligrim 08.01.2007 13:14

Re: Is MIDlet Paused :dontknow: ?
 
приходит звонок. вызывается pauseApp в ней paussed := true и работа мидлета останавливается. После окончания звонка работа мидлета возобновляется и вызывается startApp в ней paused := false. по крайней мере так происходит на большинстве телефонов. замечено что авторы МР тяготеют к Нокии, возможно на смартах при переходе в фон просто вызывается pauseApp и мидлет продолжает работать.

@lex 08.01.2007 17:33

Re: Is MIDlet Paused :dontknow: ?
 
А можно ли как-нибудь принять эти сообщения в MP?

ARV 08.01.2007 23:23

Re: Is MIDlet Paused :dontknow: ?
 
Цитата:

Сообщение от pilgrim
приходит звонок. вызывается pauseApp в ней paussed := true и работа мидлета останавливается. После окончания звонка работа мидлета возобновляется и вызывается startApp в ней paused := false. по крайней мере так происходит на большинстве телефонов. замечено что авторы МР тяготеют к Нокии, возможно на смартах при переходе в фон просто вызывается pauseApp и мидлет продолжает работать.

Порядок работы ясен - и я не сомневался в том, что он именно такой. Но где же увязка с IsMidletPaused??? Получается, она никогда не станет true: до паузы она false по определению, во время паузы она предположим и true, но ее ведь никто не вызывает (не так ли, пауза же?), а после паузы она снова false по определению... Тупик-с получается... Но ведь true она все-таки каким-то образом возвращает! КАК?

IVenoMI 09.01.2007 12:29

Re: Is MIDlet Paused :dontknow: ?
 
Некоторые телефоны поддерживают резидентные мидлеты, которые могут работать в фоновом режиме...

@lex 10.01.2007 08:30

Re: Is MIDlet Paused :dontknow: ?
 
А для простого Сименса не прокатит значит?
Может на Java можно какую-то библиотечку слепить для этого?

IVenoMI 10.01.2007 12:05

Re: Is MIDlet Paused :dontknow: ?
 
Ооооочень сомневюсь, что такое возможно...

Я еще ни один Сименс, кроме SX1, не видел, чтобы держал мидлеті в фоновом режиме...

EVIL_USER 10.01.2007 12:54

Re: Is MIDlet Paused :dontknow: ?
 
имеется под симёны патчик интересный.
### называется
после установки из любого места открывает главное меню по нажотию 3-х решоток.
Жава в этом случае остаётся работать в фоне, но это не то, что нам нужно.

IVenoMI 10.01.2007 15:31

Re: Is MIDlet Paused :dontknow: ?
 
По моему в данном случае мидлет уйдет в глухую остановку и не будет работать резидентом...

EVIL_USER 10.01.2007 16:15

Re: Is MIDlet Paused :dontknow: ?
 
В случае с патчем ### прога продолжает нормально работать, проверено многими людьми, плеер не перестаёт играть.
Нельзя только запускать другие жава проги, включая зашитые в прошивку (калькулятор, секундомер), а то или свёрнутая вылетит, или вся труба вырубится...

ARV 11.01.2007 09:48

Re: Is MIDlet Paused :dontknow: ?
 
Люди! Неужели никто так и не удосужился проверить, как функция IsMidletPaused работает?!
Код:

program PauseTest;
var
 InPause, OutPause : integer;
 
begin
 InPause := 0;
 OutPause := 0;
 repeat
  SetColor(255,255,255);
  FillRect(0,0,GetWidth,GetHeight);
  SetColor(0,0,0);
  if IsMidletPaused
  then InPause := InPause + 1
  else OutPause := OutPause + 1;
  DrawText('In  = '+InPause,10,10);
  DrawText('Out = '+OutPause,10,30);
  repaint;
  delay(1000);
 until GetKeyPressed <> KE_NONE;
end.

Откомпилируйте и проверьте! Код по-моему очевиден.

Для особо ленивых (которых, судя по всему, тут большинство) и теоретиков (которых тоже, видно, немало) сообщаю результат для Siemens C75 (не самый крутой смартфон :), как понимаете): Во время разговора мидлет работает!!!!!!!!!!!

@lex 11.01.2007 19:26

Re: Is MIDlet Paused :dontknow: ?
 
Да на Сименсе вобще эльфы есть. Они делают всё что угодно: от многозадачности до не тормозящего Дэндевского эмулятора.

2 ARV: По твоему коду всё сработало, а у меня не почему-то пашет, короче буду ещё разбираться...

ARV 11.01.2007 20:22

Re: Is MIDlet Paused :dontknow: ?
 
Я читал-читал J2ME SDK documentation и нигде не обнаружил упоминания, что в "приостановленном" режиме мидлет "заморожен". Похоже, дело обстоит так:
1. мидлет стартует - вызывается метод StartApp(), который устанавливает свой обработчик команд CommandListener, инициализирует переменные и т.п. (занимает ресурсы, одним словом), а затем вызывается метод run(). Завершение этого метода - конец работы мидлета (я не рассматриваю его).
2. поступает звонок - вызывается метод PauseApp() - паскаль в этом методе просто устанавливает значение переменной МР=-1. А в доке написано, что "мидлет должен освободить занятые ресурсы и т.п." Так вот, никакого освобождения не происходит в паскале! Наверное, если бы это делалось, надо было бы освободить CommandListener, т.е. как я понимаю, отключиться от очереди событий - тогда мидлет действительно перестал бы работать.
3. После того, как метод PauseApp() отработал - нет никаких сведений, что метод run() каким-то образом остановлен - он продолжает крутиться - это подтверждает приведенный мною ранее пример кода.
4. Когда разговор завершен - вызывается метод StartApp() - тот самый, что и при запуске мидлета - паскаль проверяет, создан ли уже экземпляр мидлета (конечно, это ведь не первый запуск) - и сбрасывает переменную МР в 0 (эта переменная и есть результат функции IsMidletPaused).
Если кто найдет какие-то упоминания в J2ME SDK о том, что я не прав - пусть меня поправит. А тот факт, что не на всех телефонах мидлеты так себя ведут, я могу объяснить двумя причинами: либо недостаточно качественное тестирование проблемы на других телефонных платформах, либо кривая реализация ява-машины. Последнее косвенно подтверждается качеством программных эмуляторов телефонов - у сименсов они на высоте, а например у самсунга - вообще левые какие-то :(.
Будут другие мнения?
P.S. Было бы интересно узнать о результатах работы приведенного мнюю кода на разных телефонах - надо же понимать, как работают наши программы!

IVenoMI 12.01.2007 11:46

Re: Is MIDlet Paused :dontknow: ?
 
Цитата:

Сообщение от ARV
Люди! Неужели никто так и не удосужился проверить, как функция IsMidletPaused работает?!
Код:

program PauseTest;
var
 InPause, OutPause : integer;
 
begin
 InPause := 0;
 OutPause := 0;
 repeat
  SetColor(255,255,255);
  FillRect(0,0,GetWidth,GetHeight);
  SetColor(0,0,0);
  if IsMidletPaused
  then InPause := InPause + 1
  else OutPause := OutPause + 1;
  DrawText('In  = '+InPause,10,10);
  DrawText('Out = '+OutPause,10,30);
  repaint;
  delay(1000);
 until GetKeyPressed <> KE_NONE;
end.

Откомпилируйте и проверьте! Код по-моему очевиден.

Для особо ленивых (которых, судя по всему, тут большинство) и теоретиков (которых тоже, видно, немало) сообщаю результат для Siemens C75 (не самый крутой смартфон :), как понимаете): Во время разговора мидлет работает!!!!!!!!!!!

МММ... У меня на CX75 результата не дал...

ARV 12.01.2007 12:06

Re: Is MIDlet Paused :dontknow: ?
 
Цитата:

Сообщение от IVenoMI
МММ... У меня на CX75 результата не дал...

А какой результат был? Что было на дисплее после звонка? Неужели In = 0 ?

IVenoMI 12.01.2007 12:09

Re: Is MIDlet Paused :dontknow: ?
 
Угу.. Именно так... Звонил себе до посинения...

@lex 12.01.2007 16:28

Re: Is MIDlet Paused :dontknow: ?
 
Сегодня с большим удивлением обнаружил, что мой код всё таки работает. Просто он работает наверное только во время разговора, а во время звучания звонка - стоит. Это единственный вывод, объясняющий мои на блюдения и тесты участников форума (у меня кстати тоже СХ75)

2 ARV:
Случайно не знаешь как засунуть в J2me_wtk библиотеки от Сименса? И как их вытащить из Эмулятора?

ARV 13.01.2007 11:26

Re: Is MIDlet Paused :dontknow: ?
 
На счет звонка - я тоже пришел к выводу, что пока трубка не снята - IsMidletPaused = false (может, мидлет и остановлен - это не проверить), и только после начала разговора ему сообщается о паузе.
А вот на счет библиотек - не понял, какие именно библиотеки, откуда вытаскивать, куда вставлять и главное - зачем? Поясни.


Часовой пояс GMT +4, время: 19:26.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot