Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Выполнения потока в зависимости от типа задачи


Автор: Mifody 24.6.2011, 18:04
Всем доброго времени суток.
Интересует экспертный (ну может и не совсем) совет smile.
Пишу отправлялку картинок на хостинги.
Итак, дано:
1. есть несколько классов, выполняют почти одинаковую работу. Сами действия довольно емкие по времени и в обычном режиме (если выполнять в основном потоке программы) подвешивают форму.
2. для избавления зависаний вынес вызов методов классов в отдельный поток, наследник TThread. С этой частью все Ок.

Что мне пока не нравится. У классов есть несколько методов, которые выполняют разные действия (авторизация, проверка списка картинок, отправка картинок). Т.е. некоторые действия производятся не зависимо от типа работы, некоторые зависят от типа работы.
Сейчас у меня, к примеру, получаются три класса потока, которые за небольшим исключением повторяют друг друга. Очень хочется свести все в один класс (дабы, если возникнет необходимость, не пришлось менять код нескольких потоков, а такая необходимость возникнет из-за особенностей защиты программы).
Какое решения мне видятся "в лоб": завести переменную в классе, типа "ТипЗадания" и в методе execute в зависимости от ее значения по условию выполнять действие. В таком случае, код метода получается довольно громоздкий :(.

Есть еще какие более "изящьные" методы решения???

Если что не понятно написал (хоть я и попытался максимально описать) спрашивайте smile.

Автор: AKATAN 24.6.2011, 19:02
Цитата

Очень хочется свести все в один класс

Так и сведи в один класс.
Сделай потомки, и не будет у тебя море копипастного кода.

Не вижу проблемы.

Автор: Dik0n 24.6.2011, 19:07
Цитата(Mifody @  24.6.2011,  18:04 Найти цитируемый пост)
Сейчас у меня, к примеру, получаются три класса потока, которые за небольшим исключением повторяют друг друга

Использовать наследование и будет тебе счастье.

Заводим базовый класс, в котором описываем общий функционал, а остальные классы наследуем от него.

Код

Base = class(TThread)
end;

MyClass = class(Base)
end;

Автор: Mifody 28.6.2011, 13:01
ммм, наверное я не совсем понятно объяснил :(.
То, что мне надо использовать в разных задачах (отправка событий, даже методы создания и уничтожения) я и сделал через базовый класс.

Вообщем наводящий вопрос/уточнение:
При запуске потока выполняется метод Execute? правильно? именно он у меня НЕМНОГО разный для разных задач. У меня вообще, в классах потоков присутствует только реализация этого метода, все остальное (благо хоть это получилось унифицировать) вынесено в базовый класс.

Автор: Snowy 28.6.2011, 13:08
Ну сделай декомпозицию Execute.
Создай разные методы для каждогой задачи, а в Execute просто вызывай нужный.
Совсем не обязательно всё класть в один метод. Разложи на несколько.

Автор: cat512 30.6.2011, 22:39
Шаблон Strategy - это называется. У меня для таких вещей обычно присутствует перекрытый класс трэда, трэд - лоджик и трэд-мэнэджер который, отвечает за конфигурацию, создание, разрушение "заданий" Трэд лоджик - реадизует саму логику "работы", ну а трэд выполняет конкретную логику, сконфигуренную в трэд - мэнэджере. Плюсы - не надо заботиться о корректном создании./разрушении потоков (особенно когда классы трэдов со временем "обрастают"), относительно гибкое распараллеливание задач. Минусы - относительная сложность, которая, будучи раз реализованная, экономит кучу времени

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)