Russian Qt Forum
Май 10, 2024, 10:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сервер на базе epoll (Linux)  (Прочитано 4169 раз)
alexis031182
Гость
« : Июнь 17, 2012, 22:01 »

Внутренности Qt-классов QTcpServer и QTcpSocket для Linux реализованы с использованием select. Вероятно это связано с необходимостью поддержки совместимости с устаревшими версиями ядер ОС. Однако имеющийся инструментарий не позволяет при помощи стандартных Qt-классов писать высокопроизводительные серверные приложения. Для решения этой задачи подготовил три epoll класса, заменяющие собой QTcpServer.

AWebEpoll - базовый абстрактный класс (наследник QThread), обрабатывающий события epoll.
AWebEpollListener - наследник AWebEpoll. Слушает по указанному порту входящие соединения.
AWebEpollWorker - наследник AWebEpoll. Выполняет обработку событий о поступлении новых данных в сокет от клиента и событий об отправке клиенту записанных в сокет данных.

Update. В классах объявлены и отправляются сигналы. В общем-то добавил я их для наглядности, чтобы было понятно, где и какое событие возникает. В рабочем же приложении лучше отказаться от их использования. И от событий (QEvent) тоже. Практика показала, что в этом случае будет присутствовать значительное замедление. Ну я думаю понятно почему. Рекомендую использовать паттерн Медиатор для реализации обмена событиями между Listener'ом и Worker'ом (-ами), а также всеми внешними по отношению к ним классами (например классом сокета и т.п.).
« Последнее редактирование: Июнь 18, 2012, 10:03 от alexis031182 » Записан
alexis031182
Гость
« Ответ #1 : Июнь 18, 2012, 14:46 »

Альтернативный вариант - использовать наследника QAbstractEventDispatcher. Возможно кому-нибудь понравится.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 20.