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


         

Извлечь указатель на объект по



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 ). Хотя бы потому, что диспетчер продолжает процесс обработки сообщений. Вместо этого объект посылает служебное сообщение с просьбой " убить его" , которое отрабатывается диспетчером.

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