powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Типа jobы
11 сообщений из 11, страница 1 из 1
Типа jobы
    #40127588
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть некое подобие агента, который (сервис) в потоке в равные промежутки выполняет простенькие запросы.
Ну и куча всяких негласных правил, напрмер, нельзя чтобы они пересекались - контроля нет.

Типа - потому что база данных грубо говоря и не база вовсе, а набор таблиц.

В принципе все работает.
Но теперь надо добавить функции планировщика, не равными промежутками а именно по времени.

Я так понимаю, все дела с таймерами надо решать в главном потоке?
Не знает никто никаких компонентов?
Нет четкого понимания и того, стоит ли переходить на Windows Sheduler - пока и так работает и так сойдет :-)

Спасибо.
...
Рейтинг: 0 / 0
Типа jobы
    #40127597
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для обеспечения запуска задачи в заданный момент времени необходимо периодически сравнивать текущее время с заданным в настройках временем. Для этого можно использовать обычный TTimer в главном потоке (он может срабатывать раз в секунду или реже), либо цикл в доп. потоке (в каждой итерации можно выполнять необходимые проверки, после чего усыплять поток на одну либо несколько секунд).
Контроль текущего времени может выглядеть таким образом:
Код: pascal
1.
2.
if (not Task[I].WasRunned) and (Now > Date + Task[I].StartTime) then
  Task[I].Run
...
Рейтинг: 0 / 0
Типа jobы
    #40127607
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не помню точно механизм реализации, но приблизительно сделано так, что есть некий список ( TDictionary ), куда по каждому заданию заносится строка, сигнализирующая о том, что задача выполняется. Но как уже писал выше, это работает через одно место - а именно , при малых интервалах и долгих апдейтах начинаются чудеса.

И поток создаётся в момент запуска задания, потом убивается. Потом опять создаётся ( со всеми подключениями, запросами, транзакциями )...

Большое спасибо.
Планировщик тогда буду делать в основном потоке, использовать обычный таймер.
Если конечно пооток должен быть всегда, то по таймеру его только запускать / возобновлять.

Есть разница вообще , откуда брать время?
Мне это и не актуально, но все же.

Если бы это был скажем MSSQL, то есть смысл у него время спрашивать?
И держать подключение всегда?

Кстати, до того как с листом потоков заморочились, проблема была что ссылки на потоки терялись ( не помню почему ), ну и утечки памяти соответственно вылезали...

Спасибо
...
Рейтинг: 0 / 0
Типа jobы
    #40127623
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С другой стороны можно просто отсортировать грядущие события и в потоке тихо
спать до нужного времени первого в списке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Типа jobы
    #40127676
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums> Нет четкого понимания и того, стоит ли переходить
bzums> на Windows Sheduler - пока и так работает и так сойдет :-)

Для начала нужно определиться с требованиями к точности
(важны ли секунды) и надежности (что будет если ваш "джоб"
упадёт/не выполнится). Потом, исходя из ответов, выбирать
решения/варианты.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Типа jobы
    #40127681
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точность до секунды наверное не важна (сейчас в расчет берутся только минуты)
Надежность - важна
...
Рейтинг: 0 / 0
Типа jobы
    #40127704
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bzums
Точность до секунды наверное не важна (сейчас в расчет берутся только минуты)
Надежность - важна

Ну, сервис, "самовосстанавливающийся".
Можно тупо раз в минуту проверять список с заданиями (да хоть текстовый файл).
Те, которые просрочены - запускать на выполнение и удалять из списка.
...
Рейтинг: 0 / 0
Типа jobы
    #40127806
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Определить время 1-го события и заснуть до этого времени (предлагали уже).
Как проснемся - надо проверить, действительно ли время пришло, или это компьютер из сна вышел через неделю. С этим вообще надо определиться - запускать задание в таких случаях, или нет.
Если нет - достаточно одного потока, спящего до времени ближайшего события. И запускать само событие уже в отдельном потокае, при этом засыспать, ожидая времени следующего события.
Если да - то надо делать по потоку на каждое задание сразу, и в каждом ждать времени (спать) отдельно. Когда дождались - выполнили задание тут же, рассчитали таймаут нового сна и снова спим. Впрочем, так наверно проще в любом случае.
...
Рейтинг: 0 / 0
Типа jobы
    #40127993
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
Что вот сейчас реально напрягает - отладка.
И что-то не пойму, глабально перехват исключений не работает?
То есть если грубо говоря в потоке поделить на ноль, то основному потоку пофиг совершенно...
...
Рейтинг: 0 / 0
Типа jobы
    #40128004
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzums
Спасибо.
Что вот сейчас реально напрягает - отладка.
И что-то не пойму, глабально перехват исключений не работает?
То есть если грубо говоря в потоке поделить на ноль, то основному потоку пофиг совершенно...


Если используется TThread и вы не перехватили исключение в методе Execute, то работа потока прервётся, а информация об ошибке будет доступна в поле FatalException объекта-потока. Если есть ссылка на объект потока, то главный поток может проверить поле FatalException.
...
Рейтинг: 0 / 0
Типа jobы
    #40128058
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bzumsТо есть если грубо говоря в потоке поделить на ноль, то основному потоку пофиг
совершенно...

И это совершенно логично, поскольку у них разные стэки и разные точки исполнения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Типа jobы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]