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


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



delete pp; // Разрушить динамический объект -


break; // вызвать виртуальный деструктор


default: // Остальные сообщения передаются


int n=objects.size(); // всем объектам в списке


for (m=0; m&#60n; m++)
{ // Извлечь указатель на объект по номеру


OBJ *pp = (OBJ*)objects[m];
// Вызвать виртуальную функцию обработки


// сообщение объектом


pp-&#62HandleEvent(pm);
// Сообщение обработано данным объектом


if (pm-&#62code == ms_NULL) break;
}
}
delete pm; // Уничтожить сообщение


}
}
//----- Проверка источников сообщений ---------------------


if (kbhit()) // Сообщение от клавиатуры


{
pm = new MS(ms_KEYB,(int)getch(),0,NULL);
messages((void *)pm);
}
if ( clock()-t &#62 1) // Сообщение от таймера (часы)


{ t = clock();
pm = new MS(ms_TICK,0,0,NULL);
messages((void *)pm);
}
}}

Диспетчер состоит из двух частей. Первая часть обеспечивает систему взаимосвязи объектов через сообщения. Для этого она извлекает по одному сообщению из списка и " пропускает" его через все объекты. Обработка сообщения осуществляется виртуальной функцией HandleEvent , конкретный вид которой будет зависеть от того, к какому производному классу относится этот объект. " Пропускание" сообщения может прерваться, если объект его сбрасывает. Так или иначе, по окончании этого процесса сообщение уничтожается.

Среди сообщений следует выделить служебные, касающиеся создания и уничтожения объектов. Когда в программе создается новый объект (а создается он в процессе обработки сообщения другим объектом), то его конструктор посылает сообщение о своем " рождении" , по которому указатель на этот объект включается в общий список. Уничтожение объекта происходит сложнее. Дело в том, что в процессе обработки сообщения объект не может уничтожить сам себя (то есть выполнить что-то вроде delete this ). Хотя бы потому, что диспетчер продолжает процесс обработки сообщений. Вместо этого объект посылает служебное сообщение с просьбой " убить его" , которое отрабатывается диспетчером.


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