Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
18.01.2022, 21:13
|
|||
---|---|---|---|
|
|||
Типа jobы |
|||
#18+
Есть некое подобие агента, который (сервис) в потоке в равные промежутки выполняет простенькие запросы. Ну и куча всяких негласных правил, напрмер, нельзя чтобы они пересекались - контроля нет. Типа - потому что база данных грубо говоря и не база вовсе, а набор таблиц. В принципе все работает. Но теперь надо добавить функции планировщика, не равными промежутками а именно по времени. Я так понимаю, все дела с таймерами надо решать в главном потоке? Не знает никто никаких компонентов? Нет четкого понимания и того, стоит ли переходить на Windows Sheduler - пока и так работает и так сойдет :-) Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.01.2022, 22:07
|
|||
---|---|---|---|
Типа jobы |
|||
#18+
Для обеспечения запуска задачи в заданный момент времени необходимо периодически сравнивать текущее время с заданным в настройках временем. Для этого можно использовать обычный TTimer в главном потоке (он может срабатывать раз в секунду или реже), либо цикл в доп. потоке (в каждой итерации можно выполнять необходимые проверки, после чего усыплять поток на одну либо несколько секунд). Контроль текущего времени может выглядеть таким образом: Код: pascal 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.01.2022, 22:33
|
|||
---|---|---|---|
|
|||
Типа jobы |
|||
#18+
Не помню точно механизм реализации, но приблизительно сделано так, что есть некий список ( TDictionary ), куда по каждому заданию заносится строка, сигнализирующая о том, что задача выполняется. Но как уже писал выше, это работает через одно место - а именно , при малых интервалах и долгих апдейтах начинаются чудеса. И поток создаётся в момент запуска задания, потом убивается. Потом опять создаётся ( со всеми подключениями, запросами, транзакциями )... Большое спасибо. Планировщик тогда буду делать в основном потоке, использовать обычный таймер. Если конечно пооток должен быть всегда, то по таймеру его только запускать / возобновлять. Есть разница вообще , откуда брать время? Мне это и не актуально, но все же. Если бы это был скажем MSSQL, то есть смысл у него время спрашивать? И держать подключение всегда? Кстати, до того как с листом потоков заморочились, проблема была что ссылки на потоки терялись ( не помню почему ), ну и утечки памяти соответственно вылезали... Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
|
18.01.2022, 23:23
|
|||
---|---|---|---|
|
|||
Типа jobы |
|||
#18+
С другой стороны можно просто отсортировать грядущие события и в потоке тихо спать до нужного времени первого в списке. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2022, 10:03
|
|||
---|---|---|---|
|
|||
Типа jobы |
|||
#18+
bzums> Нет четкого понимания и того, стоит ли переходить bzums> на Windows Sheduler - пока и так работает и так сойдет :-) Для начала нужно определиться с требованиями к точности (важны ли секунды) и надежности (что будет если ваш "джоб" упадёт/не выполнится). Потом, исходя из ответов, выбирать решения/варианты. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2022, 10:16
|
|||
---|---|---|---|
|
|||
Типа jobы |
|||
#18+
Точность до секунды наверное не важна (сейчас в расчет берутся только минуты) Надежность - важна ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2022, 11:17
|
|||
---|---|---|---|
|
|||
Типа jobы |
|||
#18+
bzums Точность до секунды наверное не важна (сейчас в расчет берутся только минуты) Надежность - важна Ну, сервис, "самовосстанавливающийся". Можно тупо раз в минуту проверять список с заданиями (да хоть текстовый файл). Те, которые просрочены - запускать на выполнение и удалять из списка. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
19.01.2022, 14:58
|
|||
---|---|---|---|
Типа jobы |
|||
#18+
Определить время 1-го события и заснуть до этого времени (предлагали уже). Как проснемся - надо проверить, действительно ли время пришло, или это компьютер из сна вышел через неделю. С этим вообще надо определиться - запускать задание в таких случаях, или нет. Если нет - достаточно одного потока, спящего до времени ближайшего события. И запускать само событие уже в отдельном потокае, при этом засыспать, ожидая времени следующего события. Если да - то надо делать по потоку на каждое задание сразу, и в каждом ждать времени (спать) отдельно. Когда дождались - выполнили задание тут же, рассчитали таймаут нового сна и снова спим. Впрочем, так наверно проще в любом случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
20.01.2022, 08:34
|
|||
---|---|---|---|
|
|||
Типа jobы |
|||
#18+
Спасибо. Что вот сейчас реально напрягает - отладка. И что-то не пойму, глабально перехват исключений не работает? То есть если грубо говоря в потоке поделить на ноль, то основному потоку пофиг совершенно... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
20.01.2022, 09:45
|
|||
---|---|---|---|
Типа jobы |
|||
#18+
bzums Спасибо. Что вот сейчас реально напрягает - отладка. И что-то не пойму, глабально перехват исключений не работает? То есть если грубо говоря в потоке поделить на ноль, то основному потоку пофиг совершенно... Если используется TThread и вы не перехватили исключение в методе Execute, то работа потока прервётся, а информация об ошибке будет доступна в поле FatalException объекта-потока. Если есть ссылка на объект потока, то главный поток может проверить поле FatalException. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
20.01.2022, 12:56
|
|||
---|---|---|---|
|
|||
Типа jobы |
|||
#18+
bzumsТо есть если грубо говоря в потоке поделить на ноль, то основному потоку пофиг совершенно... И это совершенно логично, поскольку у них разные стэки и разные точки исполнения. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=58&tablet=1&tid=2036696]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 167ms |
0 / 0 |