Активатор. Подробнее...
#include <luax.h>
Открытые члены | |
activator (lua_State *_lua) | |
Создать активатор. | |
activator (lua_State *_lua, int _iowner) | |
Создать дочерний активатор. | |
Защищенные члены | |
virtual void | on_close (lua_State *_lua) |
Обработать момент закрытия корневого активатора. | |
Защищенные данные | |
lua_State * | Lua |
Поток, который может быть возобновлен. | |
Закрытые статические члены | |
static void | init (lua_State *_lua) |
Создать таблицу активаторов потока. | |
static void | close (lua_State *_lua, int _i) |
Открыть активатор. | |
Друзья | |
class | luax_ |
Приостановить поток. |
Активатор.
Активатор - это объект, который может вызывать события модуля в результате внешних событий (например, действий пользователя, прерываний таймера и т.п). Поток может создавать активаторы, когда необходимо ожидать и обрабатывать внешние события. Активатором может быть, например, панель диалога, на которой расположены управляющие элементы, с которыми взаимодействует пользователь. Внешним событием может быть нажатие кнопки, выбор строки в списке и т.п.
Для каждого потока существует таблица активаторов, события от которых обрабатываются системой. Она используется для закрепления в памяти объектов, которые могут инициировать внешние события.Ключами таблицы являются указатели на объекты класса luax_::activator, а значениями - соответствующие пользовательские объекты Lua. Объект добавленый в таблицу активаторов не может быть удален сборщиком мусора до тех пор, пока он не будет явно удален из этой таблицы.Ключи таблицы являются слабыми ссылками.
Если таблица активаторов не пуста, то выполнение потока может быть приостановлено до момента возникновения события от какого либо активатора. Когда поток приостанавливается управление передается ядру, где происходит ожидание возникновения события и возврат управления прерваному потоку.
Ядро возвращает управление потоку, который создал активатор,вызвавший событие. Потоку передается объект, который вызвал событие, имя модуля, где находится событие и имя события в этом модуле. Передается также дополнительный параметр, значение которого зависит от вида события:
local o, m, e, p = YIELD()
Поток может быть приостановлен в том случае, когда таблица содержит только указанный активатор. В этом случае поток возобновляется только тогда, когда указаный активатор находится в таблице активаторов:
local o, m, e, p = YIELD(a)
Однако ядро не контролирует, что возобновляющее событие происходит именно от этого активатора. Поэтому, если возобновление потока другими активаторами в этот момент не желательно, то нужно блокировать остальные активаторы вне настоящего интерфейса.
Активаторы могут быть организованы в иерархию. При этом только активаторы верхнего уровня располагаются в таблице активаторов и могут приостанавливать выполнение процесса. Дочерний активатор может быть добавлен в локальную таблицу некоторого активатора. Таким образом обеспечивается синхронизация времени жизни различных активаторов. Осовбождение памяти родительского активатора осовбождет память для всех дочерних активаторов. Примером дочернего активатора может служить дочерняя панель, добавляемая динамически в родительскую панель.
luax_::activator::activator | ( | lua_State * | _lua | ) | [inline] |
Создать активатор.
Создает активатор верхнего уровня.
_lua | Стек дочернего потока. |
luax_::activator::activator | ( | lua_State * | _lua, | |
int | _iowner | |||
) | [inline] |
Создать дочерний активатор.
Создает для указанного активатора дочерний активатор.
_lua | Стек потока. | |
_iowner | Позиция родительского активатора. |
void luax_::activator::close | ( | lua_State * | _lua, | |
int | _i | |||
) | [static, private] |
Открыть активатор.
Фиксирует активатор в памяти до момента закрытия. Сначала на стек помещается активатор, а затем родительский активатор или nil для активаторов верхнего уровня.
<активатор> <родительский активатор или nil>
_lua | Стек дочернего потока. Подключает активатор к существующему активатору. Добавляет активатор в дерево активаторов как дочернюю вершину существующего активатора. При этом активатор фиксируется в памяти до момента освобождения родительского активатора. |
Функция предполагает, что объекты на стеке содержит указатель на объект luax_::object, который используется как ключ в локальной таблице активаторов.
Состояние стека не изменяется.
_lua | Стек потока. | |
_iowner | Позиция активатора-владельца. | |
_i | Позиция вложенного активатора. Удалить активатор. Удаляет активатор, расположенный на стеке потока, из таблицы активаторов. Объект освобождается для сборщика мусора. Может быть использована только для освобождения корневых активаторов. |
Функция предполагает, что объект на стеке содержит указатель на объект luax_::object, который используется как ключ в таблице активаторов.
Объект остается на стеке.
_lua | Стек дочернего потока. | |
_i | Позиция активатора на стеке. |
void luax_::activator::init | ( | lua_State * | _lua | ) | [static, private] |
Создать таблицу активаторов потока.
Таблица активаторов создается при инициализации потока. Поток должен иметь таблицу окружения, в которой создается таблица активаторов.
_lua | Стек потока, для которого создается таблица активаторов. |
virtual void luax_::activator::on_close | ( | lua_State * | _lua | ) | [inline, protected, virtual] |
Обработать момент закрытия корневого активатора.
Вызывается функцией закрытия для выполнения дополнительной обработки закрытия корневого активатора.
Не должна вызывать прерываний и исключений.
_lua | Стек потока. |
friend class luax_ [friend] |
Приостановить поток.
Приостанавливает дочерний поток и передает управление ядру, если таблица активаторов не пуста. Функция должны быть последним оператором в стеке вызовов кода C.
_lua | Стек дочернего потока. Приостановить поток для отдельного объекта. Приостанавливает потока и передает управление ядру, если таблица активаторов содержит указанный на стеке потока объект. Функция должны быть последним оператором в стеке вызовов кода C. |
Функция предполагает, что объект на стеке содержит указатель на объект luax_::object, который используется как ключ в таблице активаторов.
Объект остается на стеке.
_lua | Стек дочернего потока. | |
_i | Позиция активатора на стеке. |