Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 17:51, 24 June 2008.

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

From Forum Nokia Wiki

Перевод с английского, оригинальная статья находится здесь.


Contents

Введение

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


Реализация

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

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

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

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


Image: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)

Related Discussions
Thread Thread Starter Forum Replies Last Post
About active scheduler, how to apprehend this paragraph? 021850524 General Symbian C++ 6 2007-08-03 04:04
Active Object internals nadav70 General Symbian C++ 6 2007-11-26 10:22
New in Python for Series 60 1.2 for Series 60... spaceman76 Python 19 2005-11-04 15:52
RSocket::Accept return KErrNotReady (-18) adinkesp Symbian Networking & Messaging 5 2007-09-03 15:01
two timers davidmaxwaterman General Symbian C++ 9 2006-12-22 04:34
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX