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.

Активные объекты и нити

From Wiki
Jump to: navigation, search
Article Metadata

Статья
Автор: Den123 (26 Jul 2007)
Последнее редактирование: hamishwillee (10 Nov 2011)

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


В Symbian OS интенсивно используется асинхронное взаимодействие. Виртуально, все системные службы представлены как программные серверы, каждый из которых является отдельным процессом для большей надежности.

API, используемые для взаимодействия с системными сервисами, часто предоставляют синхронный и асинхронный варианты функций. Для того чтобы избежать блокировки пользовательского интерфейса при выполнении длительных операций, нужно использовать асинхронные функции. Такие функции активируют запрос к нужному асинхронному сервис-провайдеру и немедленно возвращают управление, в то время как сам запрос выполняется в фоне. Таким образом, можно организовать взаимодействие, например, с файловой системой. Естественно, у вызывающей программы должна быть возможность в будущем получить оповещение о том, что выполнение запроса окончено, при этом во время ожидания программа может выполнять другие задачи, например реагировать на события клавиатуры, перерисовывать изображение на экране и т.д.

На практике, использование множества нитей характерно для систем с вытесняющей многозадачностью. В таких системах каждая асинхронная задача выполняется на отдельной нити, а ожидание окончания выполнения запроса часто контролируется с помощью опроса (polling) сервис-провайдера. Реализовать такой подход можно и в Symbian OS, однако, строго не рекомендуется, в связи с неэффективностью.

Другой вариант реализации асинхронного взаимодействия - использование активных объектов. См. Активные объекты (Active Objects) в Symbian ОС.


Contents

Различие между нитями и активными объектами

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

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


Когда использовать нити необходимо

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


Преимущества активных объектов по сравнению с нитями

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


Пример использования нити

// Имя нити
_LIT(KThreadName, "MyFirstThread");
 
// Создание нити, принадлежащей текущему процессу,
// получение дескриптора
TInt res = iThread.Create( KThreadName, ThreadEntryPoint, KDefaultStackSize,
NULL, &iVariable);
 
// Подготавливаем нить к началу выполнения.
// Сразу после создания нить находится в состоянии ожидания (suspended)
// для того чтобы нить начала работать, необходимо вызвать метод Resume().
iThread.Resume();
 
// Как только нить начнет выполняться, контроль будет передан этой функции.
// В данном примере, функция просто меняет значение переданной переменной.
TInt CThreadExampleAppUi::ThreadEntryPoint(TAny* param)
{
TInt* para = static_cast<TInt *>(param);
*para = 1;
return 1;
}

Symbian OS оптимизирована для однонитевых приложений, для организации асинхронного взаимодействия использование активных объектов является предпочтительным. Старайтесь проектировать Ваши приложения для реализации с использованием только одной нити.

This page was last modified on 10 November 2011, at 03:15.
228 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.

×