Многопоточный сервер Qt. Пул потоков. Паттерн Decorator

В предыдущей статье [1] была рассмотрена работа с сокетами в библиотеке Qt. Наш сервер сетевого чата работал в одном потоке. Задача текущей статьи — описание многопоточного сервера.

Однако, если сервер просто принимает сообщение и передает его всем подключенным клиентам — распараллеливать нечего и потоки не особо нужны. В связи с этим, мы немного усложним задачу — наш сервер будет вычислять передаваемые арифметические выражения (для вычисления выражений используем Qt Script [2]).

Серверу (а точнее, сокету) надо добавить новый функционал, и в этом нам поможет шаблон проектирования «Декоратор». Когда сервер начнет выполнять все необходимые нам функции, приступим к распараллеливанию. В статье рассмотрены 2 варианта:

  • создание отдельного потока на каждое подключение;
  • использование стандартного пула потоков библиотеки Qt.

В предыдущих статьях уже был описан шаблон параллельного программирования «поставщик-потребитель» [3]. Пул потоков является родственным паттерном, но мы не будем писать свою реализацию, а используем готовую.

Читать далее

Рубрика: C++, библиотека Qt, шаблоны проектирования | Метки: , , , , , | Комментарии (4)

Работа с сетью в Qt. Сокеты. Паттерн Adapter

В статье показана работа с сетью на примере очень простого сетевого чата, а также описан никак не связанный с сетью шаблон проектирования адаптер (adapter, wrapper, обертка).

Несмотря на то, что наш чат максимально прост (он не позволяет передавать файлы и оффлайн-сообщения, не хранит историю, передает сообщения не шифрованными и т.д.), мы все же отделим часть, ответственную за работу с сетью. Эта часть будет использовать класс QTcpSocket, интерфейс которого нас не устраивает, в связи с чем, мы применим шаблон проектирования Wrapper.

Сервер чата работает в одном потоке, т.к. целью статьи я ставил описание примера, наиболее просто и наглядно показывающего использование сокетов библиотеки Qt. В одной из следующих статей я возможно опишу многопоточный чат.

Содержание:

  1. шаблон проектирования Adapter;
  2. работа с сетью в Qt. Классы QTcpServer и QTcpSocket;
  3. пример использования паттерна Adapter;
  4. исходный код сетевого чата.

Читать далее

Рубрика: C++, библиотека Qt, шаблоны проектирования | Метки: , , , | 1 комментарий

Функциональное программирование и обработка изображений

Под интригующим названием статьи скрывается обзор и небольшой мануал по языку программирования, встроенному в nip2.

Есть весьма популярная в узких кругах утилита обработки изображений, называемая VIPS [1]. Утилита кроссплатформенная и используется для обработки очень больших изображений. Состоит она из двух частей — библиотеки libvips и утилиты с графическим интерфейсом nip2.

Библиотеку libvips можно использовать в связке с языками программирования Python, C и C++. Библиотека имеет несколько особенностей, которые с одной стороны позволяют обрабатывать очень и очень больших изображения (обработка автоматически распараллеливается и изображения размером в десятки гигабайт не выжирают разом память), а с другой стороны делают программирование очень необычным мероприятием.

Созданное один раз изображение в libvips нельзя изменить, а если нам очень надо — то мы должны создать новое, измененное (но и старое не исчезнет). Операции над изображением фактически не выполняются до тех пор, пока оно не сохраняется на диск (операции накапливаются до поры, до времени).

Эти и другие особенности libvips подталкивают к использованию функционального языка для работы с библиотекой, и такой язык встроен в nip2. Язык не имеет названия, поэтому дальше я буду называть его nip2.

Nip2 — ленивый функциональный объектно-ориентированный язык с лиспоподобным синтаксисом, позволяющий без особого труда разрабатывать расширения для VIPS.

Читать далее

Рубрика: алгоритмы | Метки: , , | Добавить комментарий

Зимние Столбы

Эта галерея содержит 11 фотографий.

Фотоотчет выхода в заповедник (очень надеюсь, что заповедником и останется) «Столбы» 19.01.2014. Далеко я в этот раз не ходил — посетил Четвертый столб и погулял по Каштаковской тропе. Очень понравился красивый зимний лес — сильного ветра не было, поэтому на … Читать далее

Другие галереи | Добавить комментарий

Cистема плагинов Qt, построение графиков и Qt Script

Очень обзорная статья, описывает вершки некоторых интересных элементов библиотеки Qt. Речь идет про:

  • библиотеку Qwt, позволяющую строить графики, гистограммы, круговые (и другие) диаграммы;
  • систему плагинов библиотеки Qt, предназначенную для предоставления возможности модульного расширения программы;
  • Qt Script — язык, позволяющий, как и система плагинов, дополнять программу, но не требующий компиляции (плагина).

Статья не претендует на полноту и описывает ровно столько, сколько требуется для решения придуманной задачи. В конце статьи есть ссылки, по которым можно почитать более подробно. Так, например, важнейшая возможность скриптов Qt Script соединяться со слотами и сигналами в статье совсем не затронута, как и различные виды диаграмм Qwt.

Решаемую задачу можно сформулировать следующим образом:

Разработать программу численного интегрирования функции на заданном интервале с фиксированным шагом. Программа должна предоставлять возможность расширения за счет подключения модулей, реализующих отдельные методы интегрирования. Программа должна выводить график интегрируемой функции и визуализировать результаты интегрирования. Интегрируемая функция вводится пользователем во время выполнения программы (рис. 1).

рис. 1 снимок окна программы

рис. 1 снимок окна программы

За счет системы плагинов реализуется подключение дополнительных методов интегрирования. Библиотека Qwt используется для визуализации, а Qt Script — для предоставления возможности ввода интегрируемой функции.

Читать далее

Рубрика: C++, алгоритмы, библиотека Qt | Метки: , , , , , | Комментарии (2)

Решение логических задач на Prolog

Язык пролог начал зарождаться в далеком 1879 году, точнее в этом году известный ученый Людвиг Фреге предложил исчисление предикатов, которое лежит в основе логического программирования. Фреге был не только математиком, но и философом (как и большинство других известных ученых своего времени). В то время еще не начала рушиться классическая картина мира, популярным философским учением являлся позитивизм Конта, и Фреге разделял эти взгляды, относясь к школе аналитической философии. Одной из своих задач философы видели формализацию знаний, т.е. пытались выразить знания на более точном, научном языке, например так, как делают математики. Работы по исчислению предикатов лаконично вписались в это направление.

Позже по этой теме работали другие известные философы, такие как Бертран Рассел и Людвиг Витгенштейн, представители более новой школы логического позитивизма. Исследования ведутся до сих пор, но позитивисты несколько отошли от исчисления предикатов в сторону темпоральной логики.

В 1980х годах уже появились эффективные реализации Пролога и он рассматривался как универсальный язык, при этом использовался для реализации реляционных СУБД, автоматического доказательства теорем, разработки компиляторов, САПР и других областях [1]. В начале 1990х годов пролог продвигался, в большей мере, как удобное средство разработки графического интерфейса (лучших инструментов тогда не было) [4]. В 1992 году провалился японский национальный проект компьютера пятого поколения, одной из целей которого было исследование искусственного интеллекта. В качестве языка программирования этого компьютера был выбран пролог, популярность которого резко упала [5]. В настоящее время, пролог используется , в основном, при разработке трансляторов и в задачах искусственного интеллекта [6].

Более подробно про историю языка Пролог можно почитать в толстых книгах [1, 2, 3], но а я привел эти факты чтобы чуть-чуть отразить особенности развития этого языка и решаемых на нем задач. Традиционно в российских ВУЗах на предметах «логическое и функциональное программирование», «искусственный интеллект» выдаются задания  связанные с решением логических задач. Ноги у этих задач растут из автоматического доказательства теорем.

В статье рассматривается 2 типа логических задач — задачи на установление соответствия и задачи поиска в пространстве состояний.

Читать далее

Рубрика: Prolog, алгоритмы | Метки: , , , , , | Комментарии (6)

Обходы графа. Поиск в ширину и глубину [Prolog]

В статье описываются:

  • алгоритмы обхода графа в глубину и в ширину;
  • представление графов на языке Prolog;
  • реализация алгоритмов обхода графа на языке Prolog;

При обходе графа в статье выполняется поиск определенной вершины (выполняется поиск в ширину и поиск в глубину).

Читать далее

Рубрика: Prolog, алгоритмы | Метки: , , , , , | Комментарии (14)

Параллельная быстрая сортировка. [C++, OpenMP]

В предыдущей статье был рассмотрен параллельный цикл, однако, в OpenMP есть и другие средства распараллеливания. В настоящей статье на примере быстрой сортировки рассмотрены параллельные задачи (tasks).

В начале статьи коротко описана последовательная реализация быстрой сортировки на С++. Алгоритм быстрой сортировки описывался на блоге ранее, но приводились реализации на Prolog и Erlang, сильно отличающиеся от реализации на С++.

Затем, описаны параллельные задачи OpenMP. В конце статьи показано распараллеливание быстрой сортировки с использованием механизма задач OpenMP.

Читать далее

Рубрика: C++, алгоритмы | Метки: , , , , | Добавить комментарий

Фотографии заповедника Столбы 10 ноября

Эта галерея содержит 11 фотографий.

Очередной фотоотчет. Маршрут тот же, что и в прошлый раз, но другие погодные условия — солнечно и выпал снег, ручьи замерзли. Несмотря на прохладу, заповедник кишит, особенно в районе первого-второго столбов. На первой фотографии с Каина и Авеля видно Манскую … Читать далее

Другие галереи | Добавить комментарий

Заповедник Столбы [02.11.13]

Эта галерея содержит 7 фотографий.

Утром было холодно и шел дождь, но к вечеру пошел снег, все запорошило, несмотря на это, на Столбах было людно. Снег сменялся дождем всю неделю, поэтому местами очень сколько. Фотографий на этот раз не много — фотоаппарат, опасаясь поскользнуться, я … Читать далее

Другие галереи | Добавить комментарий

Библиотека OpenMP. Параллельный цикл

Статья ориентирована на тех, кто не знаком с библиотекой OpenMP, но хотел бы познакомиться.

OpenMP — не просто библиотека параллельного программирования, но и стандарт, официально поддерживаемый для языков Си, C++ и Fortran (а неофициально и для других языков, Free Pascal, например [1]).  Работает OpenMP только на архитектурах с общей памятью.

Библиотека OpenMP задумана так, что программист сначала может написать последовательную программу, отладить ее (ведь отлаживать параллельную программу очень тяжело), а затем, постепенно распараллеливать, дополняя директивами OpenMP.

Не секрет, что большую часть времени выполнения, программы проводят внутри циклов. Наверное поэтому, в OpenMP есть специальная директива параллельного цикла, ей и посвящена большая часть статьи.

В статье рассмотрены 2 примера распараллеливания:

  • вычисление суммы элементов массива;
  • вычисление интеграла методом прямоугольников.

Все примеры статьи написаны на С++, использовался компилятор gcc (но можно использовать и другие, отличаться будут только ключи, передаваемые компилятору). Для поддержки OpenMP, gcc должен принять ключ -fopenmp.

Читать далее

Рубрика: C++, алгоритмы | Метки: , , , | Комментарии (2)

Шаблон проектирования Prototype [C++]

Напомню, что в прошлый раз мы написали программу, которая содержала тулбар с геометрическими фигурами и поле, на которое эти фигуры добавлялись. Для каждой фигуры был определен отдельный класс, поэтому для добавления нового типа фигуры требовалось бы перекомпилировать программу. Шаблон проектирования «Прототип» решает эту проблему, позволяя порождать новые типы объектов во время выполнения программы.

Шаблон проектирования «Прототип» применяется если:

  • нужна динамическая загрузка новых типов объектов;
  • создание объекта является слишком затратным мероприятием и его возможно заменить копированием уже существующего объекта.

Статья состоит из двух частей:

  1. описан шаблон проектирования «Прототип» на наиболее общих примерах (для тех, кто не знаком с библиотекой Qt);
  2. показано каким образом можно модифицировать программу предыдущей статьи для поддержки динамической загрузки новых типов графических объектов.

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

Читать далее

Рубрика: C++, библиотека Qt, шаблоны проектирования | Метки: , , | Добавить комментарий