среда, 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 без координального переделывания чревато проблемами. Лучший конечно вариант - отказаться от него.