среда, 22 декабря 2010 г.

Использование OmniThread Libray 2.0 (OTL 2.0) для создания многопоточных приложений - 1


Недавно вышла OTL 2.0, в коей были сделаны многие изменения и добавлены новые возможности. О них я и постараюсь в мере сил рассказать, опираясь на материал предоставленный автором библиотеки.

четверг, 16 декабря 2010 г.

Вышла в свет версия 2.0 OmniThreadLibray

Итак после долгого перерыва вышла в свет новая 2.0 версия замечательной библиотеки для разработки многопоточных приложений OmniThreadLibray.

Скачать ее можно с http://code.google.com/p/omnithreadlibrary/downloads/list

В библиотеку включены очень крупные изменения. В частности для пользователей версии Delphi 2009 - добавлены новые возможности по параллельным вычислениям (unit OtlParallel). О них я постараюсь расказать в следующих заметках.

среда, 3 ноября 2010 г.

вторник, 26 октября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 17

Информация об окружении

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

четверг, 21 октября 2010 г.

Полезняшки. Запись в БД (FibPlus)

Очень часто при работе с Firevbird-ом мне приходилось генерировать различные скрипты для обновления БД. В основном это касалось скриптов вида Insert/Update. Так как большинство таких скриптов типовые, мне очень скоро пришла в голову мысль написать функцию помощник в записи/обновлении БД.

вторник, 19 октября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 16

Система связи

В данном разделе мы рассмотрим более детально подсистему связи OTL. За работу системы связи отвечает файл OtlComm.pas. Как вы знаете, данная система используется интерфейсами OTL для передачи сообщений между фоновыми задачами и основным потоком программы. Как это происходит, мы разобрались на примерах ранее. Однако использование системы связи не затрагивает только библиотеку OT. Дело в том, что система не связана жестко с OTL-библиотекой (выделена отдельно), что в свою очередь дает вам возможность использовать ее и не в OTL-приложениях.

вторник, 12 октября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 15

Создание задачи

OTL как вы знаете, предлагает несколько различных способов создания задач.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 14

Внутренняя организация OTL

Что бы успешно двигаться дальше, давайте немного углубимся в дебри OTL и поговорим о внутреннем устройстве данной библиотеки.
Самый важный модуль  OTL OtlTaskControl.pas. Это модуль с помощью интерфейса устанавливает связь с потоковой задачей.

четверг, 7 октября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 13

Создание пула задач

Начиная с версии 1.03, библиотека OTL поддерживает создание фоновых задач в пулах. Использование пулов дает возможность переложить функции управления созданными задачами с наших плеч на пул. Фактически нам не нужно будет думать о непосредственном контроле над созданными нами задачами, OTL делает это за нас.

вторник, 5 октября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 12

Практика OTL. Фоновый поиск файлов.

В этом разделе мы немного отвлечемся от исследования возможностей OTL. Перейдем так сказать к практике. И начнем рассмотрение с демонстрационного примера tests\23_BackgroundFileSearch показывающего как с помощью OTL можно сделать фоновый поиск файлов.

четверг, 30 сентября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 11

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

В этом разделе мы рассмотрим различные способы вызова методов фоновой задачи.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 10

Очереди задач

Одной из возможностей OTL являются очереди. Что они собой представляют? Допустим Вам нужно запустить несколько фоновых задач, но в определенном порядке. Например, вы работаете с некоторым массивом данных. Первый поток, заполняет данный массив некоторыми значениями. Второй поток должен переслать весь массив данных, например в Интернет. Если Вы запустите сразу две задачи, то у вас будет путаница, например первый поток, еще не успеет заполнить массив, а второй отправит неполные данные.

среда, 29 сентября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 9

Группы задач

Еще одной интересной возможностью OTL – является возможность группировки фоновых задач. Работая с группой задач, программист может, используя интерфейс группы управлять всеми входящими в группу задачами.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 8

Завершение фоновых задач по событию.

Одной из интересных особенностей библиотеки OTL в плане управления временем жизни фоновой задачи является  - завершение фоновой задачи по событию. Как вы знаете фоновую задачу можно завершить, используя метод Terminate. Однако есть еще один способ завершения фоновой задачи – способ завершения по событию. Для этого используется метод TerminateWhen с  объектом IOmniCancellationToken.

вторник, 28 сентября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 7

Обработка ошибок в OTL.

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

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 6


Обработка сообщений Windows в OTL.

Итак, в предыдущих разделах мы научились работать  с сообщениями. Однако эти сообщения были заданы нами. В данном же разделе мы рассмотрим работу с сообщениями Windows, научимся перехватывать и обрабатывать их в фоновых задачах.

воскресенье, 26 сентября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 5

Реализация каналов связи между фоновыми задачами.

И так мы научились обмениваться сообщениями между фоновой задачей и основным потоком программы. А что делать, если мы захотим обменяться сообщениями между различными фоновыми задачами. Ответ прост - мы должны создать дополнительный канал связи используя систему связи OTL. Оговорюсь сразу, подробное рассмотрение системы связи OTL будет дано отдельно, здесь же речь пойдет так сказать о практической реализации.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 4

Двухсторонняя связь. Подход 2

В данном разделе мы уйдем от метода написания цикла ожидающего прихода событий (сообщений). Конечно, цикл никуда не денется, но он будет спрятан в самой библиотеке OTL на низком уровне, а если быть точным, то в модуле OtlTask.pas.
Для этого откроем демонстрационный пример tests\5_TwoWayHello_without_loop и посмотрим, как можно переделать наш предыдущий пример проще и красивей.

пятница, 24 сентября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 3

Двухсторонняя связь. Подход 1

Итак, в предыдущем разделе мы разобрались, как осуществлять одностороннюю связь между фоновой задачей (потоком) и основным потоком программы. Теперь мы разберемся, как с помощью OTL передавать сообщения и данные из основного потока программы в фоновые потоки, созданные CreateTask.

четверг, 23 сентября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 2

Односторонняя связь.

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

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 1

Предисловие

В цикле заметок пойдет речь о создании приложений с использование библиотеки OmniThreadLibrary (http://otl.17slon.com/index.htm). Данная библиотека облегчает создание многопоточных приложений в среде Delphi и предоставляет программисту простые и  гибкие возможности по работе с фоновыми задачами, чем стандартный класс TThread. Данная цикл заметок предоставляет из себя материал, взятый из официальной документации, блога автора библиотеки, комментарий читателей блога и своих наблюдений. Фактически мной произведена некоторая систематизация материала (библиотека находится в постоянной разработке и от версии к версии часто видоизменяется, поэтому официальная документация страдает пробелами и изъянами)  и выполнено дополнительное комментирование некоторых частей официальной документации, где по-моему мнению не хватает  более подробного материала.

вторник, 21 сентября 2010 г.

Пишем Jabber-клиент на Delphi. Часть 5

Статусы, состояния, информация о присутствии, управление подпиской <Presence>

Прием и отправка статусных сообщений, а также информации о видимости  контактов и подписки на сообщения от них, осуществляется через XML-строфу <Presence>.

Атрибут type строфы <Presence> является дополнительным.

Строфа, которая не обладает атрибутом type, используется Jabber-ом, для сообщений о присутствии контакта в сети Jabber и указывает на то, что данный контакт находится в сети (онлайне) и доступен для коммуникации.

Если атрибут type присутствет в строфе <Presence>, то он управляет подпиской на сообщения и смену статусов другого контакта (объекта). Аналог подписки в IM-сетях является прохождение авторизации в ICQ.

четверг, 16 сентября 2010 г.

Пишем Jabber-клиент на Delphi. Часть 4

Базовые семантические модули

После того как мы прошли авторизацию, разберем основные базовые семантические модули  XML-строф реализованных в протоколе, их довольно немного:
<Presence> - презентационные данные, определяют статусное состояние, видимость пользователей и управление подпиской.
<Message> - собственно сами сообщения переданные или принятые пользователем.
<IQ> - Info Query, данные информационных запросов, включают в себя сами запросы, а также результаты выполнения. Данные запросы позволяют Jabber-клиентам обменивается различными данными между собой. Информационное наполнение запроса и ответа определено в пространстве имен дочернего элемента. Дополнительные расширения протокола (XEP – XMPP Extension Protocol) очень сильно используют <iq> запросы. Подробнее об них я расскажу далее.

Пишем Jabber-клиент на Delphi. Часть 3

RFC 2831 использование MD5-Digest аутенфикации в SASL

Итак, аутенфикация решает следующие задачи: Передача пароля на сервер, в закрытом виде, защиту от повторяющихся атак (monitoring nc value), защиту (monitoring nonce) в определённый промежуток времени от определённого клиента.  Для того, что бы понять, как работает данный стандарт, разберем основы SASL.

Пишем Jabber-клиент на Delphi. Часть 2

Подготовка

Сразу оговорюсь, что я не ставлю перед собой задачу написать полноценно работающий клиент соответствующий полному стандарту XMPP. Слишком большой труд, скажем так, однако основные методы работы с XMPP будут включены в мой исходный компонент.
В качестве основы для работы клиента мной были взяты наработки по работе с WinSock  Alex-а Demchenko (alex@ritlabs.com), используемые им в TICQClient, немного портированные, кое-где измененные и дополнительно комментированные мной, для  нашего демо-клиента.
В качестве парсера XML мной был взят TjanXMLParser2, благо он бесплатный, довольно быстрый. Стандартный парсер MSXML был мной отброшен по причине, того, что некоторые XML-пакеты приходили синтаксически неправильные, что начисто отрубало желание этого парсера работать с ними.

среда, 15 сентября 2010 г.

Пишем Jabber-клиент на Delphi. Часть 1

Введение

Jabber — система для быстрого обмена сообщениями и информацией о присутствии (в контакт-листе) между любыми двумя пользователями Интернета на основе открытого протокола XMPP.
В отличии от той же Аськи Jabber-сеть имеет на мой взгляд более развитые возможности, а наличие расширений протокола открывает горизонты функциональности на недосягаемые для коммерческих IM-сетей, вот некоторые из них:
Открытость: протокол Jabber открыт, общедоступен и достаточно лёгок для понимания; существует множество реализаций серверов и клиентов, а также библиотек с открытым исходным кодом.