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


         

с объектами класса OBJ путем



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; // Исключить его из списка


Содержание  Назад  Вперед