Если у Вас есть много логических задач, которые требуют постоянной обработки, и Вы хотите, это, чтобы быть сделанным в параллели использует pool+scheduler.
, Если необходимо сделать IO, связал задачи одновременно, такие как загрузка материала от удаленных серверов или доступа к диску, но потребность сделать это говорит один раз в несколько минут, затем сделайте собственные потоки и уничтожьте их, после того как Вы закончены.
Редактирование: О некоторых соображениях я использую пулы потоков для доступа к базе данных, физики/моделирования, AI (игры), и для задач в виде сценария работал на виртуальных машинах, которые обрабатывают много определяемых пользователем задач.
Обычно пул состоит из 2 потоков на процессор (так, вероятно, 4 в наше время), однако можно настроить сумму потоков, которые Вы хотите, если Вы знаете, в скольких Вы нуждаетесь.
Редактирование: причина сделать Ваши собственные потоки из-за изменений контекста, (thats, когда потоки должны загрузить и из процесса, наряду с их памятью). Наличие бесполезных изменений контекста, говорят, когда Вы не используете свои потоки, просто оставление их сидит без дела, как можно было бы сказать, может легко половина производительности Вашей программы (скажите, что у Вас есть 3 потока сна и 2 активных потока). Таким образом, если те, которые загружают потоки, просто ожидают, они съедают выше на тонны ЦП и охлаждают кэш для Вашего реального приложения
Delphi не поддерживает множественное наследование. Но классы могут поддерживать / реализовывать несколько интерфейсов, и вы можете делегировать реализацию интерфейса, чтобы вы могли имитировать множественное наследование.
Использовать интерфейсы. Что-то вроде этого (вне моей головы, на основе вашего описания ...)
type
IBikeWheel = interface
...
end;
IXYZ = interface
...
end;
IFrontWheel = interface(IBikeWheel)
...
end;
TBike = class
...
end;
TBikeWheel = class(TObject, IBikeWheel);
TBikeWheelXYZ = class(TBikeWheel, IXYZ);
TBikeFrontWheelXYZ = class(TBikeWheelXYZ, IFrontWheel);
Затем реализуйте классы для интерфейсов, которые делают то, что делают соответствующие классы в вашей старой (предположительно C / C ++) библиотеке, и создайте их экземпляры в конструкторе соответствующего класса.
Используйте полиморфизм, чтобы внедрить каждую «вещь» как отдельную иерархию объектов, а затем добавить свойства объекта к этому объекту по очереди. Итак, создайте иерархию колес и иерархию велосипедов. Затем добавьте колеса к велосипедам в качестве полей в родительском объекте bike. См. Ниже:
TBikeWheel = class
TBikeWheelXYZ = class( TBikeWheel )
TBike = class
FFrontWheel : TBikeWheel;
property FrontWheel : TBikeWheel
read FrontWhell
TBikeABC = class( TBike)
constructor Create;
end;
constructor TBikeABC.Create;
begin
inherited;
FFrontWheel := TBikeWheel.Create;
end;
TBikeXYZ = class( TBike)
constructor Create;
end;
constructor TBikeXYZ.Create;
begin
inherited;
FFrontWheel := TBikeWheelXYZ.Create;
end;
В принципе - НЕЛЬЗЯ. Delphi не поддерживает множественное наследование.
Итак, оставшись с этой дилеммой, возникает вопрос: не могли бы вы реорганизовать эту библиотеку таким образом, чтобы можно было обойтись без использования интерфейса? Является ли множественное наследование главным образом функциями и методами? Если так - используйте интерфейсы. Delphi может поддерживать несколько интерфейсов в классе.
Если множественное наследование больше связано с наследованием фактических функциональных возможностей классов, то, боюсь, вы, вероятно, смотрите на более масштабный рефакторинг. Вам нужно будет найти способ разбить эти функциональные зависимости таким образом, чтобы вы могли наследовать его от одного базового класса, возможно, с добавлением некоторых дополнительных интерфейсов.
Извините, я не могу дать простой ответ - это просто реальность.
Марк
Вы можете попытаться извлечь интерфейс, скажем IFrontWheel, из TBikeWheelFront, чтобы он стал подклассом TBikeWheel, но реализовал IFrontWheel. Затем TBikeWheelXYZ наследуется от TBikeWheel, а TBikeWheelFrontXYZ наследуется от TBikeWheelXYZ и реализует IFrontWheel.
Затем вы можете определить класс TFrontwheel и дать ему те же методы, что и интерфейс, но теперь вы их реализуете. Затем TBikeWheelFront и TBikeWheelXYZ получают частный член типа TFrontwheel, а их реализации IFrontWheel просто делегируют частным методам члена.
Таким образом, у вас нет двойных реализаций.
Вариант предложения Брайана Фроста:
TBikeWheel = class
TBikeWheelXYZ = class( TBikeWheel )
TBike = class
FFrontWheel : TBikeWheel;
protected
function CreateWheel: TBikeWheel; virtual;
public
property FrontWheel : TBikeWheel
read FrontWheel
end;
TBikeABC = class( TBike)
protected
function CreateWheel: TBikeWheel; override;
end;
function TBikeABC.CreateWheel: TBikeWheel;
begin
result := TBikeWheel.Create;
end;
TBikeXYZ = class( TBike)
protected
function CreateWheel: TBikeWheel; override;
end;
function TBikeXYZ.CreateWheel: TBikeWheel;
begin
result := TBikeWheelXYZ.Create;
end;