Python на Symbian S60: сервисные функции системы (модуль e32)

Мал золотник да дорог

Модуль e32 позволяет использовать сервисные функции операционной системы Symbian. Загружаем на смартфоне консоль Python и приступаем к изучению:

>>> import e32

>>> dir(e32)

[‘Ao_lock’, ‘Ao_timer’, ‘__doc__’, ‘__name__’, ‘_as_level’, ‘_globcnt’, ‘_mem_info’,’_stdo’, ‘_uidcrc_app’, ‘ao_callgate’, ‘ao_sleep’,’ ao_yield’, ‘drive_list’, ‘file_copy’, ‘in_emulator’, ‘inactivity’, ‘is_ui_thread’, ‘pys60_version’, ‘pys60_version_info’, ‘reset_inactivity’, ‘s60_version_info’, ‘set_home_time’,’ start_exe’, ‘start_server’, ‘strerror’]

>>>

Список поменьше, чем у appuifw, но мы не будем встречать модуль «по одежке», а сразу начнем изучать его «умственные» способности:

pys60_version

Переменная (строка), содержащая информацию о версии Python.

>>> e32.pys60_version

“1.4.0 final”

>>>

pys60_version_info

Переменная (кортеж), содержащий более подробную информацию о версии Python.

>>> e32.pys60_version_info

(1, 4, 0, “ final”, 0)

>>>

s60_version_info

Переменная (кортеж), содержащий информацию о версии SDK, на котором был скомпилирован Python:

1) (1, 2) на SDK S60 1st Edition;

2) (2, 0) на SDK S60 2nd Edition;

3) (2, 6) на SDK S60 2nd Edition Feature Pack 2;

4) (2, 8) на SDK S60 2nd Edition Feature Pack 3;

5) (3, 0) на SDK S60 3rd Edition.

>>> e32.s60_version_info

(2, 8)

>>>

Информация о версии Python.

ao_callgate(wrapped_callable)

Возвращает объект-функцию (на основе функции wrapped_callable), которую можно вызвать из любого потока программы.

ao_sleep(interval [, callback ])

Функция, после запуска которой программа «засыпает» на указанное количество секунд (interval). Вторым необязательным аргументом (callback) может быть имя функции, которая вызывается сразу после окончания «спячки». Данная функция обычно применяется в программах, где необходимо постоянно обновлять данные, и в играх при отрисовке анимации:

>>> e32.ao_sleep(5)

>>> def callback():

…        print “Hello!”

>>> e32.ao_sleep(5, callback)

Hello!

>>>

После вызова первой функции e32.ao_sleep(5) программа «заснет» на 5 секунд. После этого интервала будет вызвана вторая функция, которая выведет сообщение «Hello!».

ao_yield()

Функция указывает планировщику обработать системные события. Не позволяет зависнуть программе, интенсивно работающей с данными, поэтому часто используется при осуществлении математических вычислений, в играх и работе с файлами.

drive_list() – возвращает список дисков в виде списка строк Unicode. Обычно используется при определении путей к необходимым файлам и при создании файловых менеджеров:

>>> e32.drive_list()

[u”C:”, u”D:”, u”E:”, u”Z:”]

>>>

Используя drive_list(), получаем список дисков на смартфоне.

file_copy(target_name, source_name)

Функция копирует файл source_name (строка) в папку target_name (строка), при этом имя файла не изменяется. Если нужно одновременно и переименовать файл, то target_name должен содержать полный путь с новым именем файла. Если указанный файл target_name уже существует, то будет сгенерировано исключение.

>>> e32.file_copy(“e:\\”, “c:\\file.txt”)

>>> e32.file_copy(“e:\\name.txt”, “c:\\file.txt”)

>>>

in_emulator()

Функция возвращает 1, если программа запущена на эмуляторе, и 0 – если на смартфоне. Часто используется при отладке программы на эмуляторе для отключения некоторых функций программы, так как на эмуляторе доступны не все возможности (например, такого понятия, как уровень приема сети, на компьютере нет).

is_ui_thread()

Функция возвращает 1, если код, который вызвал эту функцию, работает в контексте текущего пользовательского интерфейса, иначе функция возвращает 0.

inactivity()

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

>>> for index in xrange(10):

…       print e32.inactivity()

…       e32.ao_sleep(1)

>>>

Функция inactivite() возвращает полезную информацию.

reset_inactivity()

Функция обнуляет значение времени простоя. Наиболее часто используемый побочный эффект от вызова функции – активирующаяся подсветка. Постоянно вызывая ее, можно добиться, чтобы подсветка не гасла:

>>> for index in range(20):

…       print e32.inactivity()

…       if e32.inactivity() > 5:

…           e32.reset_inactivity()

…       e32.ao_sleep(1)

>>>

set_home_time(time)

Функция устанавливает новое системное время time (в секундах). О модуле time для работы со временем будет сказано позже в отдельной статье.

start_exe(filename, command [,wait ])

Функция запускает *.exe программу (filename указывает на прямой путь к нему в виде строки) и передает ему параметр command (строка). Если указан необязательный параметр wait (имя функции), то он активируется только после завершения работы запущенной *.exe программы и вернет одно из двух значений: 0 – нормальный или 2 – ненормальный выход. На Symbian 6-8 функцию часто используют для запуска *.app программ:

e32.start_exe(‘z:\\system\\programs\\apprun.exe’,’c:\\system\\apps\\python\\python.app’)

start_server(filename)

Функция запускает программу filename (полный путь к файлу в виде строки) как отдельный процесс (т.е. не видно через «Диспетчер задач»). Программе, запущенной таким образом, запрещено использовать модуль appuifw. Обычно используется для создания сервисных процессов (не мозолящих глаза пользователю и выполняющих полезные функции в фоновом режиме) и  сопровождаются программой-клиентом для его управления.

Ao_lock()

Создаётся объект-«замок», способный прервать текущий процесс. Не блокируется обработка события текущего пользовательского интерфейса (т.е. программа по-прежнему будет реагировать на нажатия клавиш и т.д.). Объект имеет 2 метода:

wait()

Метод прерывает выполнение текущего потока до того момента, пока не будет вызван метод signal.

signal()

Метод сигнализирует объект Ao_lock о том, что нужно продолжить работу.

Пример:

>>> import e32,appuifw

>>> lock=e32.Ao_lock()

>>> def press():

…        lock.signal()

…        appuifw.note(u“Signal!”)

>>> appuifw.app.menu=[(u”Signal”,press)]

>>> lock.wait()

>>>

В данном примере программа останавливает свое выполнение после ввода последней команды lock.wait(). Хотя и можно будет вводить данные, выполнение команд в консоли не будет доступно (пропадет привычное приглашение «>>>»). Разблокировать текущий поток можно с пункта Singal в меню «Функции», пункт Signal. Нажатие по этому пункту приведет к выполнению функции press с помощью команды lock.signal().

Ao_timer()

Объект-таймер, задача которого заменить функцию ao_sleep там, где её использование нежелательно. Использование этого объекта также, как и Ao_lock, обходится без блокировки обработки события текущего пользовательского интерфейса. Объект имеет 2 метода:

after(interval [,callback ])

Метод прерывает выполнение текущего потока на время interval (в секундах). Вторым необязательным аргументом (callback) может быть имя функции, которая будет вызвана сразу после окончания «спячки».

cancel()

Метод указывает досрочно выйти из «спячки» и продолжить работу

>>> import e32,appuifw

>>> e32.ao_sleep(10)

>>> timer=e32.Ao_timer()

>>> def full():

…        appuifw.note(u“Full!”)

>>> def press():

…        timer.cancel()

…        appuifw.note(u“Cancel!”)

>>> appuifw.app.menu=[(u”Cancel”,press)]

>>> timer.after(10, full)

Программа сначала «заснет» на 10 секунд под воздействием функции ao_sleep, и, пока это время не пройдет, не получится воспользоваться консолью. Затем за дело примется Ao_timer. По прошествии 10 секунд высветится сообщение Full! Но до этого времени есть возможность нажать по пункту Cancel меню «Функции», и объект прекратит обратный отсчет, о чем вас уведомит сообщение Cancel!

Т.е. данный объект удобен в случае, когда «спячка» может длиться значительное время и необходимо иметь возможность в любое время ее прекратить. А вот если бы мы использовали ao_sleep, то пришлось бы ждать выполнения функции до самого конца, сколько бы это ни заняло.

Следует отметить, что использование некоторых функций (ao_sleep(), метод wait() объекта Ao_lock и метод after() объекта Ao_timer) из этого модуля на смартфоне Symbian 8.1 (Nokia N70, N72, N90) приводит к багам – в верхней части экрана в режиме ожидания пропадают некоторые элементы, как то: часы и уровень сети. Причем это происходит только тогда, когда программа запущена как приложение из «Меню» и сразу после запуска выполняются именно эти функции. К такому же негативному эффекту приводит любой цикл (for и while, например). Избежать проблем с интерфейсом можно, если совершить какие-нибудь действия: выбрать пункт меню «Функции», нажать кнопку. Баги не появятся.

Тем не менее при создании приложений рекомендуется предусмотрительно проработать данный вариант, иначе неизбежны отклики недовольных пользователей смартфонов на Symbian 8.1 (а модели N70-N72 чрезвычайно популярны). В будущем на конкретном примере будет показано, как лучше избегать этих неприятностей, а пока, работая в интерактивной консоли, вам не надо думать обо всем этом.






Рекомендуемый контент




Copyright © 2010-2017 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.