Показать сообщение отдельно
Старый 30.01.2014, 00:56   #3
Zorko
AnyKey`щик
 
Регистрация: 18.07.2012
Сообщений: 4
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Проблемы с повторным запуском мидлета на эмуляторе WTK

Жека, подобный код есть и в моём мидлете.

PROCEDURE (midlet: Midlet) startApp* ;
BEGIN
  display := lcdui.Display.getDisplay(midlet);
  IF midlet.screen = NIL THEN (* Если экран ещё не существует, создать его. *)
    NEW(midlet.screen);
    Width := midlet.screen.getWidth();
    Height := midlet.screen.getHeight();
    midlet.screen.img := lcdui.Image.createImage(Width, Height); (* Теневой экран. *)
    midlet.screen.gra := midlet.screen.img.getGraphics();
    display.setCurrent(midlet.screen);
  ELSE (* Экран существует в памяти; просто перерисуем его. *)
    midlet.screen.repaint;
    midlet.screen.serviceRepaints;
  END;
  (* ВНИМАНИЕ! startApp должен выполниться максимально быстро, так как
     эта процедура запускается во внутреннем управляющем потоке операционки,
     некоторые девайсы даже лимитируют время вызова, например,
     если 20 секунд будет висеть, то решат, что зависло, и убьют.
     Именно с этой целью мы желаем перевести исполнение в другой поток. *)

  (* Если поток существует, он продолжит свою работу; иначе создадим его. *)
  IF ~midlet.threadStarted THEN
    midlet.thread := lang.Thread.Init(midlet.screen);
    midlet.thread.start; (* Запустим наследника Runnable.run в новом потоке. *)
    midlet.threadStarted := TRUE;
  END;
END startApp;
Проблема, с которой я столкнулся, не так уж тривиальна. На этом WTK'шном эмуле есть баги (или "особенности") либо с работой потоков, либо с перерисовкой экрана. Даже не знаю копаться ли в этом дальше, потому что как минимум на пяти разных моделях телефонов такой проблемы нет.

Да и пишу я на Компонентном Паскале, а не на Java. Так что исследования продолжаю. Пока что выяснил только то, что startApp вызывается лишь один раз.
(Offline)
 
Ответить с цитированием