| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Выполнения потока в зависимости от типа задачи |
| Автор: Mifody 24.6.2011, 18:04 |
| Всем доброго времени суток. Интересует экспертный (ну может и не совсем) совет Пишу отправлялку картинок на хостинги. Итак, дано: 1. есть несколько классов, выполняют почти одинаковую работу. Сами действия довольно емкие по времени и в обычном режиме (если выполнять в основном потоке программы) подвешивают форму. 2. для избавления зависаний вынес вызов методов классов в отдельный поток, наследник TThread. С этой частью все Ок. Что мне пока не нравится. У классов есть несколько методов, которые выполняют разные действия (авторизация, проверка списка картинок, отправка картинок). Т.е. некоторые действия производятся не зависимо от типа работы, некоторые зависят от типа работы. Сейчас у меня, к примеру, получаются три класса потока, которые за небольшим исключением повторяют друг друга. Очень хочется свести все в один класс (дабы, если возникнет необходимость, не пришлось менять код нескольких потоков, а такая необходимость возникнет из-за особенностей защиты программы). Какое решения мне видятся "в лоб": завести переменную в классе, типа "ТипЗадания" и в методе execute в зависимости от ее значения по условию выполнять действие. В таком случае, код метода получается довольно громоздкий :(. Есть еще какие более "изящьные" методы решения??? Если что не понятно написал (хоть я и попытался максимально описать) спрашивайте |
| Автор: AKATAN 24.6.2011, 19:02 | ||
Так и сведи в один класс. Сделай потомки, и не будет у тебя море копипастного кода. Не вижу проблемы. |
| Автор: Mifody 28.6.2011, 13:01 |
| ммм, наверное я не совсем понятно объяснил :(. То, что мне надо использовать в разных задачах (отправка событий, даже методы создания и уничтожения) я и сделал через базовый класс. Вообщем наводящий вопрос/уточнение: При запуске потока выполняется метод Execute? правильно? именно он у меня НЕМНОГО разный для разных задач. У меня вообще, в классах потоков присутствует только реализация этого метода, все остальное (благо хоть это получилось унифицировать) вынесено в базовый класс. |
| Автор: Snowy 28.6.2011, 13:08 |
| Ну сделай декомпозицию Execute. Создай разные методы для каждогой задачи, а в Execute просто вызывай нужный. Совсем не обязательно всё класть в один метод. Разложи на несколько. |
| Автор: cat512 30.6.2011, 22:39 |
| Шаблон Strategy - это называется. У меня для таких вещей обычно присутствует перекрытый класс трэда, трэд - лоджик и трэд-мэнэджер который, отвечает за конфигурацию, создание, разрушение "заданий" Трэд лоджик - реадизует саму логику "работы", ну а трэд выполняет конкретную логику, сконфигуренную в трэд - мэнэджере. Плюсы - не надо заботиться о корректном создании./разрушении потоков (особенно когда классы трэдов со временем "обрастают"), относительно гибкое распараллеливание задач. Минусы - относительная сложность, которая, будучи раз реализованная, экономит кучу времени |