суббота, 5 ноября 2011 г.

Полезняшки: Всплывающие информационные окна

Добрый день!

Сегодня поговорим о полезняшках в нашей професии программиста. Одной из таких полезняшек для меня стали всплывающие информационные окна, наподобие тех что есть в QIP-e.
Вообще предыстория этих окон следующая, в одном моем проекте понадобились всплывающие окна, да не просто всплывающие а поддерживающие следующую функциональность:
  • наличие кнопок-ответов
  • возможность задания кнопки по умолчанию
  • возможность автонажатия кнопок по истечению некоторого времени с отображением таймера обратного отчета
  • группировка окон, заключающаяся в том, что при появлении нового всплывающего окна, оное окно не перекрывала существующие, а при удалении окна с экрана, окна текущие сортировались в некий порядок.
  • раскраска окна по ситуации - "стандартное", "информационное", "окно сообщения об ошибке" и.т.д
  • возможность одновременного закрытия всех окон
  • возможность перетаскивания окон и изменения размеров
ну и прочие мелкие полезняшки.

среда, 20 июля 2011 г.

Вышла новая версия OmniThreadLibrary 2.1

Вышла новая версия OmniThreadLibrary 2.1

Скачать ее можно либо тут  либо с официального SVN проекта.

Вкратце, что появилось нового:

Добавлена поддержка исключений в методы Parallel.Future и Parallel.Join. так как эти методы претерпели существенные изменения, существует опасность проблем с ранее написанным кодом. Прежде, чем устанавливать новую версию проверьте history.txt и документацию в OtlParallel.pas для дополнительной информации по совместимости.

Вы также с выходом новой версии получаете полную UML диаграмму классов и методов OTL.

Добавлены новые демонстрационные примеры:
  • 43_InvokeAnonymous: - пример использования метода IOmniTaskControl.Invoke и IOmniTask.Invoke.
    44_Fork-Join QuickSort: - пример реализации быстрой сортировки QuickSort используя Parallel.ForkJoin.
    45_Fork-Join max: Выбор максимального элемента в массиве используя Parallel.ForkJoin.
    46_Async: Демо
    для Parallel.Async.
    47_TaskConfig: Демо для Parallel.TaskConfig.
     

четверг, 23 июня 2011 г.

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

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

среда, 4 мая 2011 г.

Коллекции во внешнем COM-сервере. Простое решение.

Добрый день дорогие коллеги!

В этой заметке пойдет речь о создании внешнего COM-сервера и реализации в нем простой коллекции. Что я подразумеваю под коллецией. Под ней я подразумеваю,то что некий COM сервер имеет грубо говоря некий набор данных к которым нужно получить доступ. А так как набор данных может быть разным то нужно предоставить пользователям возможность получать эти данные проходом по коллеции. Классическим примером может служить COM-сервер MS Excel который предоставляет пользователям коллецию рабочих листов IWorkSheet. Что-то подобное в простом решении мы сейчас и реализуем.

понедельник, 18 апреля 2011 г.

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

Ранее мы рассматривали создание параллельных задач всегда в контектсте использования CreateTask. Однако для простых задач, можно использовать новую особенность библиотеки а именно - Parallel.Async.
Короче говоря, Parallel.Async принимает анонимные методы, обычный метод или процедуру (все они должны быть без параметров) и выполняет его в фоновом потоке. Вот и все чудеса. Для простых фоновых задач это уже подспорье. Отпадает нужда в вызове CreateTask.

вторник, 22 марта 2011 г.

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

Очередь выходных данных и исходящие буферы
В предыдущих частях мы немного разабрались с внутренним механизмом работы Parallel ForEach. В этой части мы разберемся с очередью выходных даных. В OTL она представлена модификатором .PreserveOutput.
Очередь выходных данных, как правило, используются вместе с .Into- модификатором. Причина этого кроется в обеспечении интеграции между параллельной инфраструктурой и вашим параллельный кодом. Тем кодом, который выполняется в качестве задачи в Parallel.ForEach.
В обычной конструкции ForEach, выход из параллельной задачи не определен.
Вы имеете право делать все, что вам угодно с каждым элементом параллельного цикла, выводить какие-либо результаты (в случае, если нужно) в рамках работы с элементом, но параллельные потоки, выполняющиеся в рамках распараллеливания цикла ничего знать об этом не будут.

вторник, 15 марта 2011 г.

Опасный MxArrays

Небольшая заметка, посвещена модулю Mxarrays.pas входящиму в Decision Cube. Данному модулю уже больше 10 лет и он включается во все версии Delphi.
Все бы ничего, но так как ревизию данного модуля программисты embercadero не проводили в нынешних уловиях его использовать опасно.
В чем же заключается опасность Mxarrays.pas

При наличии на борту оперативной памяти >= 2 Гб ваша программа при инициализации будет вываливаться к Raised exception class ERangeError with message 'Range check error', разработчики догадались записывать доступное кол-во памяти в Integer - это максимум 2 ГБайта, а если памяти больше, то кол-во уходит минус. Что было нормально 10 лет назад в нынешних условия опасно, тем что на каких то машинах прога будет работать без проблем, а на каких то улетать в Range check error


Второе и тоже немаловажное - это неэффективное использование кода, приводящие к периодическому множественному перераспределение памяти. Конечно это не так страшно, но тоже не всегда приятно.

Резюмируя, можно подытожить - что использвание  Mxarrays.pas без координального переделывания чревато проблемами. Лучший конечно вариант - отказаться от него.



вторник, 8 февраля 2011 г.

Введение в обобщенное программирование (Generics) - 4 (События,методы класса)

Обобщения в событиях
Как вы знаете, события в Delphi очень похожи на процедурные типы, но в отличие от них они могут быть определены только в объектах. Так как внутренний механизм событий и процедруных типов идентичен – то вы можете использовать обобщения и в событиях. В отличие от процедурных типов, в событиях компилятор требует наличие дополнительного параметра, который является объектом, передающимся в данную процедуру.
В этом примере мы создадим обобщенное определение события (Procedure Of Object), которое будет уведомлять нас о любых изменениях:

вторник, 1 февраля 2011 г.

Введение в обобщенное программирование (Generics) - 3

Использование обобщений в разных конструкциях языка
Итак, мы разобрали применение обобщений в классах, однако роль обобщений на этом не заканчивается, помимо применения в классах обобщения могут использоватся и в других конструкциях языка:

понедельник, 31 января 2011 г.

Введение в обобщенное программирование (Generics) - 2


Стек на основе обобщений (generics)

Итак, начнем создавать стек, основанный на обобщении (generics).
В название класса, добавим параметр типа, заключив его в “<”,”>”
                        
 type

   TGenericStack<T> = class

зарезервированный тип T может быть помещен в те-же самые места, как и любой стандартный тип Delphi: в конструктор, в методы класса, или в параметры функций.

type

 TGenericStack<T> = class

    genArray: Array of T;

    TopOfStack : Integer;

    constructor Create(length: Integer);

    procedure push(Value: T);

    function pop: T;

 end;

Введение в обобщенное программирование (Generics) - 1


Данная статья выполнена на основе материалов подготовленных Felix John COLIBRI и является переводом, выполненным мной с учетом небольших дополнений и разъяснений.
Обобщённое программирование — это парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание.
В Delphi обобщенное программирование представлено в виде новой конструкции языка – обобщении (generics).

среда, 26 января 2011 г.

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


Провайдер исходных данных

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

вторник, 25 января 2011 г.

Фильм...фильм...фильм или как я искал описания фильмов


Добрый день коллеги.

Сегодня мы отвлечемся немного от OTL и поговорим о духовном – поговорим о кино, вернее о сайте kinopoisk.ru и поиске описаний фильмов. К сожалению кинопоиск не предполагает никого API для поиска и получения информации о фильмах и что сразу приходит на ум это парсирование страниц и вытаскивание из них нужной нам информации, что возможно но довольно таки трудоемко.

пятница, 14 января 2011 г.

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

Продолжение, начало в http://deeptown12.blogspot.com/2011/01/omnithread-libray-20-otl-20-4.html

Регулировка стадий


В нашем демонстрационном примере (41_Pipeline) большое количество данных (один миллион чисел) передаются через многоступенчатый процесс. Если один поток будет приостановлен в течение некоторого времени или поток будет выполнять вычисление, по времени медленнее чем время вычисления предыдущего потока то может возникнуть ситуация когда входная очередь этого потока может заполниться данными под которые будет выделено слишком много памяти, которую в свою очередь позже нужно будет освобождать. Для таких случаев для более правильной регулировки выделения памяти трубопровод использует новые возможности блокирующей коллекции, появившиеся в версии 2.0.

четверг, 13 января 2011 г.

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

Многоступенчатые процессы


Модуль OtlParallel в OmniThreadLibrary предлагает некоторые решения высокого уровня, которые позволяют Вам легко управлять некоторыми видами процессов параллельно. До некоторых пор OTL предоставляло только фоновые вычисления (Parallel.Future), независимые параллельные процессы (Parallel.Join) и параллельные циклы, где фоновая задача, выполняющаяся в данном цикле, зависела только от значения цикла, а не от вычислений, сделанных в других фоновых задачах Parallel.ForEach. К сожалению, многие параллельные процессы не подпадают ни под одну из этих категорий.

среда, 12 января 2011 г.

Использование OmniThread Libray 2.0 (OTL 2.0) для создания многопоточных приложений - 3. Волшебство Parallel.ForEach. Краткий обзор.

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

понедельник, 10 января 2011 г.