This page was last modified 08:48, 26 July 2007.
Активные объекты и нити
From Forum Nokia Wiki
Перевод с английского, оригинальная статья находится здесь.
В 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 оптимизирована для однонитевых приложений, для организации асинхронного взаимодействия использование активных объектов является предпочтительным. Старайтесь проектировать Ваши приложения для реализации с использованием только одной нити.
| Related Discussions | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Считывание входящих смс в онлайн режиме (желательно незаметно для пользователя) | GenSoft | Russian Developer Forum - Форум Российских разработчиков | 22 | 2008-04-27 14:01 |
| Программирование под Symbian OS. Ресурсы, литература (только легальные ссылки!) | ivey | Russian Developer Forum - Форум Российских разработчиков | 16 | Yesterday 18:05 |
