2015-10-08 3 views
1

Я скачал ПЗБД http://www.omnithreadlibrary.com/OTL не может быть скомпилирован под D2007

и компилировать D2007 grouproj, установите пакет, без проблем.

Затем я создаю простое консольное приложение, которое использует модуль OtlParallel, конечно же, я добавляю в проект файлы OtlParallel и некоторые другие pas.

Но он жалуется, что Generics.Collections не найден.

+0

OtlParallel не поддерживается в D2007, поскольку D2007 не имеет общей поддержки. – gabr

+1

Это то, что сказано на домашней странице проекта «В настоящее время поддерживаются версии 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5, XE6, XE7, XE8 и 10 Seattle». –

+1

Из http://otl.17slon.com/book/chap04.html#highlevel: "2.1 Введение Абстракции высокого уровня реализованы в модуле OtlParallel. Все они созданы с использованием фабричного класса Parallel. Высокоуровневый код интенсивно использует анонимные методы и генерические файлы, что делает Delphi 2009 минимальной поддерживаемой версией. Поскольку реализация дженериков в D2009 не очень стабильна, я бы рекомендовал использовать, по крайней мере, Delphi 2010. " – gabr

ответ

2

The documentation говорит:

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

Это нас обоих дженерики и анонимные методы делает данное устройство полностью несовместима с Delphi 2007.

Если вы хотите использовать конструкцию как Parallel.For с Delphi 2007 и OTL, то вам придется обратно-порт OtlParallel сам. Без анонимных методов это очень сложно сделать и достичь того же жидкого стиля кода. Вам придется использовать процедурные типы вместо анонимных методов. И вам придется вручную выполнять закрытие.

Таким образом, вместо того, чтобы использовать

TProc = reference to procedure; 

вы бы использовать

TMethod = procedure of object; 

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

Удачи вам!

+0

спасибо .. Я внедрил простой ParallelFor и все еще выяснял, почему у этого есть взаимоблокировки http://stackoverflow.com/questions/33137336/delphi-asynccalls-deadlock-when-terminating-the-threads –

+1

Это не основано на OTL, хотя , –

+0

Я знаю. Я реализовал ParallelFor, основанный на AsyncCall, используя процедурные параметры вызова, как вы предложили. –