SEvents
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