forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Прочие вопросы (http://forum.boolean.name/forumdisplay.php?f=50)
-   -   Обработка нажатий кнопок (http://forum.boolean.name/showthread.php?t=7289)

Skythrone 07.11.2008 09:06

Обработка нажатий кнопок
 
Сделал мидлет. Полностью свой графический интерфейс. Курсор перемещается обычными кнопками. На эмуляторе - всё ОК.

Раскидал мидлет по знакомым - около 50 разных тестеров. И оказалось, что обработка нажатий кнопок очень тормозит.

Как известно, в MP есть два варианта отлова нажатия: GetKeyPressed (для мгновенного нажатия) и GetkeyClicked (для ситуации нажал-отпустил).

Так вот, как показала практика, на подавляющем большинстве телефонов (за исключением самых последних моделей) отлов нажатия очень тормозит! При этом мидлет не делает никаких операций, просто по циклу проверяет наличие нажатой кнопки, и только потом начинает действовать.

В таком виде:

Код:

repeat key:=getKeyClicked until key<>0;
реакция на нажатую кнопку происходит через 1.5-2 секунды после самого нажатия.

А в таком виде:

Код:

repeat key:=getKeyPressed until key<>0;
нужно вообще давить на кнопку долго и упорно, прежде чем произойдёт реакция.

Телефоны: SE K-700, Nokia 5300 и т.п.

Как быть? Что делать? Что посоветуете?

Может, можно сделать специальную библиотеку для отлова нажатия кнопок более правильным (быстрым) способом ?

ViNT 07.11.2008 11:04

Ответ: Обработка нажатий кнопок
 
Нужно вставлять Delay в цикле обработки нажатий, т.е. что-то типа
PHP код:

repeat
 key
:=GetKeyPressed;
 
Delay(100);
 if 
key=...
until key=0

иначе система не успевает корректно обработать нажатие. Тут хватит 100-200 мс, юзер такую задержку реально не заметит, зато система успеет отреагировать.

odd 11.11.2008 08:18

Ответ: Обработка нажатий кнопок
 
Да, сам раньше сталкивался с подобной проблемой. Причем что интересно - чем круче телефон, тем больше тормоза. Зато на самых древних телефонах программа пашет нормально. Избавлялся от демонов - так же. Вставлял Delay(50); и всё работет нормально. Причина тут, видимо, та что я и говорил в хелпе - при выполнении функции Delay телефон не тупо ждет, а на определенное количество миллисекунд позволяет работать другим процессам или приложениям. Если опрос клавы в программе делать без паузы - сам телефон не сможет опрашивать клаву т.к. не будет получать свой квант процессорного времени.

Skythrone 11.11.2008 12:22

Ответ: Обработка нажатий кнопок
 
Спасибо за инфо.

А указанная хитрость имеет отношение только к GetKeyPressed, или на GetKeyClicked тоже сработает ?

ViNT 11.11.2008 13:10

Ответ: Обработка нажатий кнопок
 
Тут все дело в том, что код мидлета выполняется в потоке с высоким приоритетом, поэтому вызов любой функции в цикле без задержки не дает системе обрабатывать события. Работа функции Delay основана на приостановке выполнения потока мидлета на указанное время, т.е. вызывая Delay мы останавливаем поток и отдаем процессорное время системе. Так что должно работать и для GetKeyClicked.


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

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