SEvents
Материал из ALT Linux Wiki
Becase (обсуждение | вклад) м (→Выполнение сценария: Добавлена пометка о журналировании изменений состояния системы) |
Becase (обсуждение | вклад) м (Изменён URL с prometheus на packages.) |
||
Строка 1: | Строка 1: | ||
[[Категория:SEvents]] | [[Категория:SEvents]] | ||
- | '''SEvents'''<ref>[https://sourceforge.net/projects/sevents/ Страница на SourceForge]</ref><ref>[http:// | + | '''SEvents'''<ref>[https://sourceforge.net/projects/sevents/ Страница на SourceForge]</ref><ref>[http://packages.altlinux.org/sevents Пакет в ALTLinux]</ref> - система событийного программирования с фактором случайности, написана на языках Java и C. |
Создана для обучения студентов принципам событийного программирования, по сути своей близка к имитационному моделированию. | Создана для обучения студентов принципам событийного программирования, по сути своей близка к имитационному моделированию. | ||
Текущая версия на 08:49, 12 июля 2011
SEvents[1][2] - система событийного программирования с фактором случайности, написана на языках Java и C. Создана для обучения студентов принципам событийного программирования, по сути своей близка к имитационному моделированию.
Содержание |
Событийное программирование
Событийное программирование - это стиль программирования, в котором вычисления активизируются в результате какого-то события в системе, являются реакцией на это событие, изменяя состояние системы[3].
Событийное программирование может быть как минимум двух вариантов:
- программирование от событий
- программирование от приоритетов
В первом случае реакция на событие выполняется немедленно (просто как вызов функции), во втором случае существует план по обработке событий и каждое новое возникшее событие вносит коррективы в этот план. План вызовов обработчиков может строиться по различным зависимостям, либо по приоритетам.
Сценарий
По сути событийное программирование характеризуется взаимодействием между событиями, поэтому какие-либо нетривиальные вычисления в сценарии событий SEvents выполнить не удастся, для этого есть возможность создания объектов системы - динамических библиотек, которые могут влиять на процесс выполнения событий.
Пример Сценария
Программа на языке SEvents имеет вид сценария, в заголовке которого можно определить переменные и константы 3-х типов: boolean, int и double.
var boolean init = false; ";" - это комментарий const double pi = 3.14; begin event name = "Событие инициализации"; уникальное имя события cond = time == 0; условие, при котором может возникнуть данное событие priority = 5; приоритет события, согласно которому данное событие будет обрабатываться repeatable = false; является ли это событие возобновимым probability = 1; вероятность выполнения этого события, вещественное значение от 0 до 1 body init = true; end
Выполнение сценария
В SEvents время дискретное, системная переменная времени time пробегает значения от 0 до MAX_TIME во время выполнения одного сценария. Сценарий завершается в случае, если time == MAX_TIME, либо если системной переменной terminate присвоить истинное значение, значение переменной time в сценарии изменить невозможно (она меняется самой системой).
В каждый момент времени time выполняется по одному оператору у обработчиков активных событий и опрашивается реакция от объектов системы. Операторы событий выполняются согласно приоритетам событий (значение в priority), но с вероятностью UPDATE_PROBABILITY операторы обработчиков событий с меньшим приоритетом могут быть выполнены вместе в одном ряду с операторами событий с большим приоритетом.
Все изменения состояния в системе журналируются.
Операторы работы с событиями
Приведённые ниже операторы доступны как в сценарии, так и для динамических библиотек-объектов системы.
Значение | Оператор | Описание |
---|---|---|
boolean | isSleep("Имя событие") | спит ли сейчас событие с указанным именем |
boolean | isRun("Имя события") | выполняется ли в данный момент событие с указанным именем |
boolean | isFinished("Имя события") | выполнилось ли событие с указанным именем |
boolean | wasEvent("Имя события") | выполнялось ли когда-либо событие с указанным именем |
int | getTime() | получить текущее значение времени, то же самое, что и использовать time |
void | setSleep("Имя события") | усыпить событие с указанным именем |
void | setWake("Имя события") | пробудить событие с указанным именем |
void | killEvent("Имя события") | убить событие с указанным именем |
int | getDelay("Имя события") | получить количество итераций времени, в течении которого событие с указанным именем будет неактивно |
void | setDelay("Имя события", delay) | установить количество итераций времени, в течении которого событие с указанным именем будет неактивно |
Пример сценария с операторами
begin event name = "Инициализация"; cond = time == 0; body end event name = "Пришёл преподаватель"; cond = wasEvent("Инициализация"); body end event name = "Проводится лекция"; cond = wasEvent("Пришёл преподаватель"); body killEvent("Проводится практика"); end event name = "Проводится практика"; cond = wasEvent("Пришёл преподаватель"); body killEvent("Проводится лекция"); end event name = "Дали задания"; cond = wasEvent("Проводится практика"); probability = 0.5; body end event name = "Перемена"; cond = isFinished("Проводится практика") || isFinished("Проводится лекция") body terminate = true; завершение end
Объекты
Объекты системы - динамические библиотеки, способные участвовать в протекании событий и отображать себя в окне программы. Объекты также имеют возможность создавать в системе свои переменные, отсутствующие в сценарии, в случае чтения или записи несуществующей переменной.
Пример объекта
#include "libloader/include/functions.h" #ifdef __cplusplus extern "C" { #endif void run(void) { if (!wasEvent("init") || !hasImage()) { return; } long sColor = 0xff0000; long x, y, color; x = getInt("x"); y = getInt("y"); long x1, y1; x1 = getInt("x1"); y1 = getInt("y1"); if (x > 0 && x < x1 && y > 0 && y < y1) { color = getColor(); setColor(sColor); fillRect(0, 0, x1, y1); setColor(color); } } #ifdef __cplusplus } #endif