Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обрабока событий

41K
25 августа 2010 года
gaga
44 / / 22.07.2009
Не подскажите правильный способ в чистых плюсах обрабатывать асинхронные события? Т.е., например, есть у меня парсер, который разбирает поток входящих по сети сообщений. При получении определенного сообщения надо что-то сделать в других местах.
Я посмотрел в других местах, но в qt и vcl используются языковые расширения, еще в двух библиотеках коллбэки обычные.
В данный момент я сделал тоже на коллбэках, но это не плохо тем, что приходится делать многие объекты глобальными, поскольку в функции нет возможности иначе к ним обращаться. Почти все пишу руками, поэтому доступ есть ко всем классам.
41K
25 августа 2010 года
gaga
44 / / 22.07.2009
Ну и сразу приведу пример.
Есть у меня класс парсера сообщений(Parser), который я использую примерно так:
Код:
#include "HanlderClass.h" // тут объявлен класс, который хочет реагировать на сообщения

// вызывается парсером при получении определенного сообщения
int message_handler( int msgId, void* data, int dataLen )
{
  Event evt = get_event( data, len );
  handlerClass.messageReceived( evt );
  return 0;
}

// где-то в другом файле
void someFunc()
{
  Parser parser;
  // парсер будет вызывать функцию message_handler при получении сообщения "Msg1"
  parser.addMessage( "Msg1", message_handler );
  parser.processStream();
}

Мне не нравится необходимость доступности объявления объекта класса HandlerClass (часто это какая-нибудь левая надпись на экране(Label), которая обновляется при получении сообщения) при определении коллбэка.
1
25 августа 2010 года
kot_
7.3K / / 20.01.2000
Реализуйте свой менеджер сообщений. В очереди которого классы которым необходимо получать уведомления, должны будут регистрировать свои функции для событий. Например.
Зачем парсеру знать, какие объекты должны получать сообщения? Это ваша ошибка проектирования - а никак не проблема коллбек-функций.
41K
26 августа 2010 года
gaga
44 / / 22.07.2009
kot_,
у меня парсер и не знает о существовании клиентов. Все что нужно, чтобы им пользоваться - определить и зарегистрировать(addMessage()) коллбэк, который ни от чего не зависит и является обычной самостоятельной функцией. Точно так же построены многие библиотеки.

Ах да, забыл сказать: виртуальные функции использовать нельзя;)
Поэтому я и не придумал, как использовать наблюдателя напрямую. У меня по сути и есть наблюдатель, только из эпохи чистого С, что мне и не нравится. )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог