Информатика и технология программирования


Система объектов, управляемых сообщениями - часть 3



zlist messages; // Сообщения программы


public:
PRG();
~PRG();
void SendEvent(char,int,int,void *);
void run();
};


PRG *OBJ::programm = NULL;

Конструктор связывает объект-программу с объектами класса OBJ путем установки в них статического указателя на самого себя. После этого все объекты могут передавать сообщения методом SendEvent , который просто ретранслируется в аналогичный метод SendEvent в классе PRG. Последний создает объект-сообщение и помещает указатель на него в конец списка сообщений messages .


// Конструктор: связаться с классом OBJ


PRG::PRG()
{ OBJ::programm = this; }


//---- Прием и запись нового сообщения -------------------


void PRG::SendEvent(char code0,int x0,int y0, void *p0)
{ MS *pm;
pm = new MS(code0,x0,y0,p0);
messages((void *)pm); // Переопределенная операция x(void*) -


} // включить последним


Метод run представляет собой диспетчер сообщений, обеспечивая посредством их связь типа " каждый с каждым" . Это значит, что каждое сообщение пропускается через всю цепочку объектов, которые либо игнорируют его, либо обрабатывают. Обработка может закончится очисткой сообщения, тогда оно будет принято всего одним (первым) объектом, В противном случае сообщение будет широковещательным, то есть на него будут реагировать все объекты, которые настроены на его обработку.


// Диспетчер сообщений и объектов -------------------


void PRG::run()
{ MS *pm;
clock_t t;
t = clock();
while(1)
{
for (n=0; (pm = (MS *)messages.Remove(0) !=NULL; n++)
{ // Пока есть сообщения в очереди -


switch (pm-&#62code) // исключить первое


{ // и переключиться по коду


case ms_BORN: // Служебное сообщение от конструктора


objects(pm-&#62p); // объекта - включить в список объектов


break;
case ms_NULL:
break; // Пустое сообщение


case ms_EXIT:
return; // Сообщение о завершении работы


case ms_KILL: // Сообщение об уничтожении процесса -


void *q = pm-&#62p; // Посылается объектом, который хочет


// завершить работу


pp = (OBJ *)objects.Remove(q);
if (pp == NULL) break; // Исключить его из списка




Начало  Назад  Вперед



Книжный магазин