Может быть, вы хотите использовать что-то вроде SQLite. взгляните на О SQLite
настройте свои задачи как поток событий и имейте прогресс отчета 'о механизме' обработки событий. Каждый экземпляр события может иметь свое собственное имя, сообщающую о прогрессе аннотацию/шаблон, и т.д. если Вы хотите пойти настолько далеко
если это - шаблон, который часто происходит, это стоит усилия для инфраструктуры. Когда Вы сделаны, применимый код мог бы посмотреть что-то как:
EventQueue tasks = new EventQueue();
tasks.Add(new TaskEvent(this.doTask1,"Foo-ing the bar"));
tasks.Add(new TaskEvent(this.doTask2,"Bar-ing the foo"));
tasks.Add(new TaskEvent(this.doTask3,"Glitching and whinging"));
...
tasks.Execute(this.ProgressEventHandler);
Вы могли, возможно, использовать Аспектно-ориентированное программирование и создать Аспект Прогресса?
Существует много реализаций AOP. В мире Java наиболее распространенными 2 является AspectJ и Spring (который использует или AspectJ или основанные на прокси аспекты).
Вы могли создать класс Задачи со свойством имени и делегатом. Поместите каждую задачу в набор, затем выполните итерации через нее, печатая сообщение и вызвав делегата к каждой задаче.
Это зависит, сколько конфигурации необходимо на лету, я ожидал бы, что код будет очень общим, и иметь задачи быть установкой через пружину или любой контейнер МОК.
Это все было бы в пружинной конфигурации: конфигурация xml предоставила бы объект задачи свое имя и параметры. затем добавьте эти задачи к набору и вручите тот набор taskrunner.
Бегун задачи является затем кодом, который сигнализирует об остановке, и запустите каждой задачи, но каждая задача затем является бесплатной дать определенное состояние того, как это идет. Также taskrunner будет ловить любые исключения и продолжать идти, если что-то допустит ошибку. Это могло быть сделано настраивающимся, чтобы сказать, что определенные задачи зависят от завершения других, и некоторые задачи должны остановить все, если они перестали работать.
Я не соглашаюсь, что AOP должен использоваться здесь. излишество.
Было бы естественно иметь создание отчетов в doTask () вызовы.
Обычно генератор отчетов был бы одиночным элементом, что все объекты, отправленные сообщения в и класс генератора отчетов, были reponsible для решения, если и где показать его - строка состояния, файл журнала, stderr и т.д.
Принятие шаблона в том, что Вы делаете:
у Вас может быть класс "Задачи" (родитель для всех Ваших задач), чей делают (), метод разделяется на подклассы и автоматически регистрируется, запускаются и конец задачи.
Просто идея.
Я не был бы ручной код числовые части отображенных сообщений как этот (любое время, необходимо добавить или удалить действия или изменить последовательность, которую у Вас есть путаница вырезания и вклейки, чтобы сделать). Вы хотели бы любой объект, обрабатывает метод ReportProgress к самому автоинкременту, как он продвигается.
+1 на предложении AOP. Это - классическая озабоченность crosscutting, что AOP решил бы изящно.
Довольно простой и очевидный способ должен был бы создать абстрактный класс, который имеет a do()
метод и краткий обзор doTask () и getName () методы:
do() {
ReportProgress("Starting " + this.getName());
doTask();
ReportProgress("Finished " + this.getName());
}
Затем в Ваших задачах:
class Task1 extends Task {
getName(){return "Task 1";}
doTask() {
//do stuff here
}
}
У Вас могла затем быть Задача, которая имеет doTask () метод, который работает do()
на целом наборе других задач. Это могло легко быть рекурсивно, в котором любая Задача могла бы затем выполнить много подзадач.
К сожалению, я думаю лучший способ сделать, это действительно зависит от деталей - по крайней мере, какой язык Вы используете. Например, в Python Вы могли использовать менеджера по контексту для обеспечения написания кода как это:
with progress_report("Task 1"):
do_task_1()
Это могло, например, гарантировать, что "Задача 1 сделана", сообщается, даже если do_task_1 () повышает исключение. Если бы Вы хотели, то Вы могли бы обработать исключения отдельно и распечатать что-то другое как "Задача 1 отказавшая" или "Прерванная задача 1".
В нашем инструментарии у нас есть контроллер задачи, который управляет задачами. Задача выполняется как поток. В дополнение к типичной поддержке потока задача поддерживает методы прогресса. Одно возможное представление на прогресс является визуальным индикатором выполнения с заголовком, который относится к имени задачи и шагу в задаче. Для поддержки видимой статистики и состояния код должен выполнить случайные вызовы к методу прогресса задачи. Как правило, это сделано в для циклов, так как прогресс процента может быть оценен текущим индексом, разделенным на предел.
Контроллер задачи является полезным местом для добавления глобального управления потоком, датчиков состояния, другой статистики и рычагов измерения производительности. Некоторые многопоточные ошибки и синхронизирующие проблемы могут быть проанализированы путем исследования состояния контроллера и состояния всех задач.
Если бы Вы используете.NET, я предложил бы использовать Блок приложений Инжекции политики из Библиотеки Предприятия (Минимальная версия: 3.1). Я использовал подобный материал, чтобы сделать, "Возвращаются к идентификационным данным пула приложений" для веб-сайта, который был тяжел на олицетворении.
Вы могли сделать то же со своей задачей. Вы могли просто определить класс задачи с фабрикой, которые создают объект с фабрикой Объекта библиотеки Предприятия и автоматически добавляют "Прежде" и "После" сообщения к задаче. Это дало бы ТОЧНО, что Вы хотите с elegence, который требуется.
Развлекайтесь!
Вы могли назвать ReportProgress из doTask методов, которые могли бы заставить его выглядеть немного более чистым, вместо этого Вы просто имели бы:
doTask1();
doTask2();
Создание отчетов было бы обработано в тех методах.
Вы могли использовать AOP, но мои мозговые крики KISS!! (Сохраните Это Простым Глупый), в этом случае. Если это - просто простое представление чего-то более сложного, с которым Вы имеете дело, AOP мог быть опцией.