netlib.narod.ru< Назад | Оглавление | Далее >

Использование обработчиков сообщений

Перед тем, как двигаться дальше, вы должны создать функцию обратного вызова для обработки сообщений. Логика этой функции прямолинейна. Она должна определить, какое сообщение было получено, и обработать его как можно быстрее. Можете представлять обработчик сообщений в виде воронки, изображенной на рис. 5.9.


Рис. 5.9. Сетевой объект получает сообщения из сети и позволяет обработчику сообщений обрабатывать их одно за другим

Рис. 5.9. Сетевой объект получает сообщения из сети и позволяет обработчику сообщений обрабатывать их одно за другим


Прототип вы уже видели, так что взгляните на пример функции:

// Прототип функции обратного вызова
HRESULT WINAPI MessageHandler(PVOID pvUserContext,
                              DWORD dwMessageId,
                              PVOID pMsgBuffer)
{
    switch(dwMessageId) {
        case DPN_MSGID_CREATE_PLAYER:
            // Обработка создания игрока
            return S_OK;

        case DPN_MSGID_DESTROY_PLAYER:
            // Обработка удаления игрока
            return S_OK;
    }
    return E_FAIL;
}

Создав систему switch...case вы можете быстро отобрать необходимые сообщения, отбросив все остальные. Возврат значения S_OK сообщает об успешной обработке сообщения. Значение E_FAIL указывает, что возникла ошибка.

ПРИМЕЧАНИЕ
Также может быть возвращено значение DPNSUCCESS_PENDING, с которым вы будете иметь дело на стороне сервера. Подробнее о нем вы узнаете в разделе «Получение данных».

Каждое сообщение поступает с буфером данных, который приводится к типу соответствующей структуры. Структуры следуют той же схеме именования, за исключением того, что их названия начинаются не с DPN_MSGID_, а с DPNMSG_, как показано ниже:

DPNMSG_CREATE_PLAYER  *pCreate; // DPN_MSGID_CREATE_PLAYER
DPNMSG_DESTROY_PLAYER *pDestroy; // DPN_MSGID_DESTROY_PLAYER

pCreate  = (DPNMSG_CREATE_PLAYER* )pMsgBuffer;
pDestroy = (DPNMSG_DESTROY_PLAYER*)pMsgBuffer;

Конечно, содержание этих сообщений полезно только для конкретного сетевого объекта, так что нет необходимости использовать их все. Далее в этой главе, в разделах «Работа с сервером» и «Работа с клиентом» вы увидите использование сообщений с соответствующим объектом.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz