SEvents

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
(Выполнение сценария: Добавлено описание хитрости выполнения.)
м (Выполнение сценария: Добавлена пометка о журналировании изменений состояния системы)
Строка 37: Строка 37:
В каждый момент времени time выполняется по одному оператору у обработчиков активных событий и опрашивается реакция от объектов системы. Операторы событий выполняются согласно приоритетам событий (значение в priority), но с вероятностью UPDATE_PROBABILITY операторы обработчиков событий с меньшим приоритетом могут быть выполнены вместе в одном ряду с операторами событий с большим приоритетом.
В каждый момент времени time выполняется по одному оператору у обработчиков активных событий и опрашивается реакция от объектов системы. Операторы событий выполняются согласно приоритетам событий (значение в priority), но с вероятностью UPDATE_PROBABILITY операторы обработчиков событий с меньшим приоритетом могут быть выполнены вместе в одном ряду с операторами событий с большим приоритетом.
 +
 +
Все изменения состояния в системе журналируются.
=== Операторы работы с событиями ===
=== Операторы работы с событиями ===

Версия 14:08, 2 июня 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 операторы обработчиков событий с меньшим приоритетом могут быть выполнены вместе в одном ряду с операторами событий с большим приоритетом.

Все изменения состояния в системе журналируются.

Операторы работы с событиями

Приведённые ниже операторы доступны как в сценарии, так и для динамических библиотек-объектов системы.

ЗначениеОператорОписание
booleanisSleep("Имя событие") спит ли сейчас событие с указанным именем
booleanisRun("Имя события") выполняется ли в данный момент событие с указанным именем
booleanisFinished("Имя события") выполнилось ли событие с указанным именем
booleanwasEvent("Имя события") выполнялось ли когда-либо событие с указанным именем
intgetTime() получить текущее значение времени, то же самое, что и использовать time
voidsetSleep("Имя события") усыпить событие с указанным именем
voidsetWake("Имя события") пробудить событие с указанным именем
voidkillEvent("Имя события") убить событие с указанным именем
intgetDelay("Имя события") получить количество итераций времени, в течении которого событие с указанным именем будет неактивно
voidsetDelay("Имя события", 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

Ссылки

  1. Страница на SourceForge
  2. Пакет в ALTLinux
  3. Стили и методы программирования
 
Личные инструменты