Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Активные объекты (Active Objects) в Symbian ОС

From Wiki
Jump to: navigation, search
Article Metadata

Статья
Перевод:
Den123
Последнее редактирование: hamishwillee (09 Dec 2011)

Contents

Введение

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


Реализация

Образец использования - клиент-серверная архитектура. Если сервер слишком долго обрабатывает запрос клиента, клиент может воспользоваться ожиданием и выполнить какие-то другие задачи.

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

Для того чтобы реализовать механизм асинхронной обработки, требуется учесть множество низкоуровневых деталей. Это делает программный код тяжелым для понимания, сопровождения, повторного использования. Как результат, могут возникнуть трудно обнаруживаемые ошибки. Реализация данного механизма для мобильных устройств требует, кроме того, очень экономного использования памяти.

Активный объект инкапсулирует механизм выполнения асинхронных запросов. Клиент посылает асинхронный запрос, вызывая специальную функцию активного объекта. Как только запрос будет выполнен, будет вызвана соответствующая функция активного объекта(RunL()) для оповещения. Ниже представлена диаграмма, отражающая механизм реализации:


ActiveObject1.png

UML диаграмма классов


Каждый активный объект использует асинхронный сервис-провайдер (AsynchronousServiceProvider) предоставляющий возможность выполнения асинхронных запросов. AsynchronousServiceProvider принимает в качестве параметра переменную для хранения статуса исполняемого запроса. При вызове функции активного объекта для реализации запроса, выполняется передача запроса на выполнение AsynchronousServiceProvider и изменяется значение статусной переменной, чтобы отразить ожидающий статус выполнения. Как только выполнение запроса заканчивается, значение переменной статуса становится равным результату выполнения (например, KErrNone) и планировщик (CActiveScheduler), принадлежащий вызывающей нити, получает сигнал о завершении выполнения. Планировщик выполняет оповещение (вызывает метод RunL()) соответствующего активного объекта.

Активные объекты и планировщик функционируют в рамках одной нити (а AsynchronousServiceProvider обычно в рамках другой) и вместе реализуют механизм кооперативной многозадачности.

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

Активные объекты реализуют кооперативную многозадачность, но не вытесняющую - это приводит к некоторым сложностям. Только одно событие может вызвать RunL() в конкретный момент времени. Соответственно, метод RunL() должен завершаться как можно быстрее, что не всегда возможно.


Определение активных объектов

Активные объекты, реализующие механизм асинхронных запросов, инкапсулируют:

  • переменную iStatus - содержит статус выполняемого запроса
  • дескриптор (handle) асинхронного сервис-провайдера (обычно это объект R-класса)
  • соединение с сервис-провайдером - обычно выполняется во время создания
  • функцию для выполнения асинхронного запроса (определяется пользователем)
  • функцию, которую вызывает планировщик по завершению выполнения запроса (RunL())
  • функцию для прекращения выполнения еще незавершенного запроса (Cancel())


Заключение

Активные объекты часто используются при разработке ПО для Symbian ОС. Для создания активного объекта нужно объявить потомка класса CActive и реализовать необходимые методы. Реализовывать планировщик (CActiveScheduler) обычно не нужно - объект этого класса уже содержится в структурах данных, которые используются при создании приложения.


Ссылки по теме

Внешние ссылки

Бен Моррис. "CActive и Все-Все-Все" v1.9 (pdf, 353Kb)

This page was last modified on 9 December 2011, at 00:53.
248 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×