LINUX.ORG.RU

Событийная модель приложения - что и как


0

2

Добрый вечер! Решил переписать свое приложение на Си - перейти на событийно-ориентированную модель. Есть ли такая документация, или книги, как проектировать подобные вещи, рекомендации какие, примеры. Спасибо.

★★★★★

Не очень понятно, что именно надо. Я просто в гугле вбивал «epoll example» и читал маны, мне хватило. Мне кажется, это не такая уж обширная тема.

harvos
()
Ответ на: комментарий от harvos

Да нет, проблемы не с реализацией, а с проектированием. Как сделать это красиво и правильно.

XVilka ★★★★★
() автор топика
Ответ на: комментарий от XVilka

Можно почитать исходники nginx, конкретно /event/modules/ngx_epoll_module.c. Это по сути обертка для epoll'a, построенная на callback'ах. Я писал именно с нее, вроде все неплохо.

harvos
()

посмотри как драйвера в линупсовом ведре реализованы.

anonymous
()
Ответ на: комментарий от Reset

Я сам прогать на плюсах не умею, но помогал отлаживать код на boost:asio. Имхо это ппц какой-то, лучше libev воткнуть и не коряжится. Моё имхо, не претендую на абсолютную истину.

true_admin ★★★★★
()

Когда я учился писать событийно-ориентированные приложения, мне здорово помог талмуд http://rghost.ru/20067151
Правда там применительно к серверам, но тоже почитать не лишним будет.

А если твоя задача тоже имеет отношение к серверам, то я могу ещё добросить литературы.

Number_Seven
()
Ответ на: комментарий от Number_Seven

нет, не к серверам, но статья интересная, спасибо!

XVilka ★★★★★
() автор топика

как-нить так:

я писал так как-то

есть обьекты производные от класса
class Event {
  virtual execute() = 0;
}

class DoSomething : public Event {
protected:
  string str;
public:
  virtual execute() { cout << str << endl; }
  void setString(string &str) { this->str = str; }
}

void eventProcessor()
{
  while(continue)
  {
    Event *p = queue.dequeue();
    p->execute();
    delete p;
  }
}

void someFunction()
{
  // do something
  // create event
  Event pEvent = new Event();
  pEvent->setString("do something");
  queue.add(pEvent);
}

anonymous
()
Ответ на: комментарий от Reset

Понял, значит такие спагетти на 4 строки это нормально :)

boost::asio::async_write(socket_, boost::asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()), boost::bind(&chat_session::handle_write, shared_from_this(), boost::asio::placeholders::error));

А на питоне всё получается гораздо короче, аккуратней и понятней :). Ну и тормознее, само-собой.

true_admin ★★★★★
()
Ответ на: комментарий от x0r

вот там есть темплейты...

Я не знаю что это :). В моей книжке по плюсам(которую я читал больше 10 лет назад) вообще такого не было :). Или не дочитал...

true_admin ★★★★★
()
Ответ на: комментарий от placement_new

libevent проще, да, но там и возможностей меньше. А asio совершенно не предполагает, что бы человек не знающий cpp смог за день написать сервер.

placement_new ★★
()
Ответ на: комментарий от placement_new

Сервера пишу, в остальном ты прав :). Почему я не могу поделиться своими субъективными впечатлениями о крестах на лоре? :)

true_admin ★★★★★
()

Кстати, я бы ориентировался не на традиционные обработчики событий на коллбэках а на всягие гринлеты итп. Очень упрощает писанину, отладку и вообще кол-во телодвижений.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

> значит такие спагетти на 4 строки это нормально :)

Это код, написанный в образовательных и иллюстративных целях, поэтому тут мало используется импорт имён.

Кроме того, тут используется boost::bind, что делают, мягко говоря, далеко не все программисты на плюсах, даже любящие буст.

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

LamerOk ★★★★★
()
Ответ на: комментарий от anonymous

на чистом Си - можно посмотреть в код qemu

XVilka ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

Хм, сейчас посмотрел - что-то с книгами туговато, где-то я их уже пролюбил. Из того, что запомнилось, это:

Дуглас Камер «Сети TCP/IP, Том 3. Разработка приложений типа клиент/сервер для Linux/POSIX» (ISBN 5-8459-0296-7).
Стивенсон - Разработка сетевых приложений. Без комментариев, привел для галочки, эта книга должна быть первой для всех начавших интересоваться темой.
А вообще в статьях будут ссылки на литературу, там можно много чего накопать, не буду дублировать.

Из статей:
http://rghost.ru/20301741 - A Design Framework for Highly Concurrent Systems. Советую взглянуть там на список литературы.
http://www.kegel.com/c10k.html - божественная ссылка, хоть инфо там несколько устарело. Отдельно оттуда хочу выделить http://pl.atyp.us/content/tech/servers.html
Если интересует автоматное программирование, тогда стоит посмотреть сюда: http://www.softcraft.ru/auto.shtml#ap - достаточно статей по этой теме.

Number_Seven
()
Ответ на: комментарий от Number_Seven

Спс.

Про автоматное я знаю, у меня есть Шталыто и Поликарпова, вторая - и в электронном, если чё.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.