среда, 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;