Цикличная работа в определенное время. Как?

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Доброго времени суток!

Помоги найти эстетичное решение.

Задача такая, мне надо, чтобы проект повторял цикл в каждые 0, 5, 10, 15.... и так далее минут, 00 секунд.

Условно сделали действие, ушли на паузу и снова повторяем, как время "х" наступает.

На скоро руку, в связи с отсутствием нужных знаний, пробовал делать разные костыли.

Получаем {-TimeNow.Minute} далее Switch и там все нужные мне минуты кратко 5, если нет, повторяем цикл до тех пор, пока не будет нужное время. Естественно от такой постоянной цикличности, процессор с увеличением проектов начинает загружаться близко к максимальному.

Потом мне пришла такая идея, подумал, ну вау, круто!

Свой Json код: "60-{-TimeNow.Second-}" результат кладём в переменную {-Variable.Pause-} и соответственно уходим на паузу на данное число. В теории я думал, должно сработать. И пауза будет ровно до 00 секунд следующей минуты. Но почему то, сеё действие делает с задержкой. Т.е. один раз он может нормально закончится ровно в "00" секунд, а в какой то момент с задержкой до 6 секунд, не понимаю почему, думал это должно просчитываться моментально. (Браузер отключен в проекте). Весь проект выполняется меньше секунды, чем задержка от Json до Паузы....

В общем, подскажите пожалуйста оптимальное решение:

Стартуем только во время кратное 5., каждые 5 минут. Сделали свои дела и ушли на паузу до следующих 5 минут.


Спасибо!
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 444
Благодарностей
1 287
Баллы
113
процессор с увеличением проектов начинает загружаться близко к максимальному
Ну так запустите проект без использования браузера и не будет ничего кушать 1 поток. Если нужно много потоков запускать, так внутри проекта задавайте количество сколько делать
C#:
Guid id = Guid.Parse(project.TaskId); // Записываем ID проекта
ZennoPoster.SetTries(id, 10); // Установить 10 Сколько делать
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 012
Благодарностей
540
Баллы
113
Доброго времени суток!

Помоги найти эстетичное решение.

Задача такая, мне надо, чтобы проект повторял цикл в каждые 0, 5, 10, 15.... и так далее минут, 00 секунд.

Условно сделали действие, ушли на паузу и снова повторяем, как время "х" наступает.

На скоро руку, в связи с отсутствием нужных знаний, пробовал делать разные костыли.

Получаем {-TimeNow.Minute} далее Switch и там все нужные мне минуты кратко 5, если нет, повторяем цикл до тех пор, пока не будет нужное время. Естественно от такой постоянной цикличности, процессор с увеличением проектов начинает загружаться близко к максимальному.

Потом мне пришла такая идея, подумал, ну вау, круто!

Свой Json код: "60-{-TimeNow.Second-}" результат кладём в переменную {-Variable.Pause-} и соответственно уходим на паузу на данное число. В теории я думал, должно сработать. И пауза будет ровно до 00 секунд следующей минуты. Но почему то, сеё действие делает с задержкой. Т.е. один раз он может нормально закончится ровно в "00" секунд, а в какой то момент с задержкой до 6 секунд, не понимаю почему, думал это должно просчитываться моментально. (Браузер отключен в проекте). Весь проект выполняется меньше секунды, чем задержка от Json до Паузы....

В общем, подскажите пожалуйста оптимальное решение:

Стартуем только во время кратное 5., каждые 5 минут. Сделали свои дела и ушли на паузу до следующих 5 минут.


Спасибо!
C#:
            int counter = 0;
            while (true)
            {
                Thread.Sleep(counter);


                //ТВОЙ ЦИКЛ




                counter = counter + 300000;
            }
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
C#:
            int counter = 0;
            while (true)
            {
                Thread.Sleep(counter);


                //ТВОЙ ЦИКЛ




                counter = counter + 300000;
            }
Можно разжевать дураку, и какая логика работы будет.

UPD. A, у меня цикл это целый шаблон, и закончить работу он может в разное время. Грубое ожидание в 300000 не пойдёт
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 012
Благодарностей
540
Баллы
113
Можно разжевать дураку, и какая логика работы будет.

UPD. A, у меня цикл это целый шаблон, и закончить работу он может в разное время. Грубое ожидание в 300000 не пойдёт
Дурак тут видимо я, ток щас допер что проект то у тебя на кубиках написан) А там много кубиков? мб можно быстренько на код переделать
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Дурак тут видимо я, ток щас допер что проект то у тебя на кубиках написан) А там много кубиков? мб можно быстренько на код переделать
Не имею навыков сделать быстренько, к тому же в полете тестирую гипотизы. Возможно, в будущем и сделаем, но пока так)
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Дурак тут видимо я, ток щас допер что проект то у тебя на кубиках написан) А там много кубиков? мб можно быстренько на код переделать
94393

Я не понимаю, почему вот это действие работает с задержкой?

Вроде всё логично, либо я устал.

Получаем текущие количество секунд, условно 15. Вычитываем 60 - 15 (получаем 45 секунд). Ставим паузу на 45 секунд. И по идее оповещение (тестове) должно сработать ровно в 00 секунд, начала следующей минуты.

P.S. Блок if else не на своем месте. Он должен быть над Паузой
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 012
Благодарностей
540
Баллы
113
Не имею навыков сделать быстренько, к тому же в полете тестирую гипотизы. Возможно, в будущем и сделаем, но пока так)
Ну я тут слепил кой че) вроде работает)

Создаешь переменную Counter со значение по умолчанию 0
2022-07-14_00-15-18.png

Потом создаешь 2 c# снипета

в первом вот это
C#:
Thread.Sleep(Convert.ToInt32(project.Variables["Counter"].Value));
Во втором вот это

C#:
int Counter = Convert.ToInt32(project.Variables["Counter"].Value);
project.Variables["Counter"].Value = Convert.ToString(Counter + 300000);
И собираешь вот такую конструкцию

2022-07-14_00-17-15.png


В итоге получается так, первый c# сниппет отправляет поток в сон на столько миллисекунд сколько указано в переменной Counter, изначально она равна нули, потом выполняется твой цикл, и на втором c# снипете происходит увеличение переменной Counter на 300000 мс это 5 минут, в итоге при возврате на первый сниппет поток будет во сне 5 минут, потом опять твой цикл, потом опять увеличение на 300000 итого переменная Counter уже будет 600000 это 10 минут, в итоге сон перед циклом будет уже 10 минут, и так по кругу, с увеличением сна перед каждым циклом на 5 минут
 
  • Спасибо
Реакции: Voldemar

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Ну я тут слепил кой че) вроде работает)

Создаешь переменную Counter со значение по умолчанию 0
Посмотреть вложение 94394

Потом создаешь 2 c# снипета

в первом вот это
C#:
Thread.Sleep(Convert.ToInt32(project.Variables["Counter"].Value));
Во втором вот это

C#:
int Counter = Convert.ToInt32(project.Variables["Counter"].Value);
project.Variables["Counter"].Value = Convert.ToString(Counter + 300000);
И собираешь вот такую конструкцию

Посмотреть вложение 94395


В итоге получается так, первый c# сниппет отправляет поток в сон на столько миллисекунд сколько указано в переменной Counter, изначально она равна нули, потом выполняется твой цикл, и на втором c# снипете происходит увеличение переменной Counter на 300000 мс это 5 минут, в итоге при возврате на первый сниппет поток будет во сне 5 минут, потом опять твой цикл, потом опять увеличение на 300000 итого переменная Counter уже будет 600000 это 10 минут, в итоге сон перед циклом будет уже 10 минут, и так по кругу, с увеличением сна перед каждым циклом на 5 минут
Я уже попробовал вот так:

C#:
int a = 60;
int b = Convert.ToInt32(project.Variables["second"].Value);
int pause = (a-b)*1000;
//Пауза
System.Threading.Thread.Sleep(pause);
Вроде работает четко.

Насчёт вашего решения, как я уже говорил, строгая пауза в 5 минут меня не устроит. Т.к. на выполнения цикла может потребоваться чуть больше времени, если данные в базу данных например пришли с задержкой.

Кубик который выше сочинил, в принципе меня устроит. Не красиво, но работает :D

94396
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 012
Благодарностей
540
Баллы
113
Я уже попробовал вот так:

C#:
int a = 60;
int b = Convert.ToInt32(project.Variables["second"].Value);
int pause = (a-b)*1000;
//Пауза
System.Threading.Thread.Sleep(pause);
Вроде работает четко.

Насчёт вашего решения, как я уже говорил, строгая пауза в 5 минут меня не устроит. Т.к. на выполнения цикла может потребоваться чуть больше времени, если данные в базу данных например пришли с задержкой.

Кубик который выше сочинил, в принципе меня устроит. Не красиво, но работает :D

Посмотреть вложение 94396
Так он на паузу не уйдет пока цикл ваш не выполниться. Видимо я не правильно понял
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Так он на паузу не уйдет пока цикл ваш не выполниться
94397

У меня заклиненная история. Конец ведет к началу. Должно работать 24/7 ))

Идеально было бы конечно сделать квадратик, просыпается только во время 0,5,10,15.....55 минут.
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 012
Благодарностей
540
Баллы
113
Посмотреть вложение 94397

У меня заклиненная история. Конец ведет к началу. Должно работать 24/7 ))

Идеально было бы конечно сделать квадратик, просыпается только во время 0,5,10,15.....55 минут.
Ну я совсем запутался) Я ведь именно так и сделал, конец, ведет к началу, зациклено все наглухо.
Надо начало заменить на первый сниппет а в конец добавить второй, свич убрать можно. Но да ладно, сделали и сделали)
94398
 
  • Спасибо
Реакции: Voldemar

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Ну я совсем запутался) Я ведь именно так и сделал, конец, ведет к началу, зациклено все наглухо.
Надо начало заменить на первый сниппет а в конец добавить второй, свич убрать можно. Но да ладно, сделали и сделали)
Посмотреть вложение 94398
А смысл двух снипетов? К тому же, как я уже сказал 5 минут жесткой паузы мне не пойдёт. Цикл у меня может закончится в 00:35:17 условно если я добавлю +30000 паузы, то в следующий раз начну также в 00:40:17
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 012
Благодарностей
540
Баллы
113
А смысл двух снипетов? К тому же, как я уже сказал 5 минут жесткой паузы мне не пойдёт. Цикл у меня может закончится в 00:35:17 условно если я добавлю +30000 паузы, то в следующий раз начну также в 00:40:17
Во втором снипете на это заменить

C#:
while(Convert.ToInt32(DateTime.Now.ToString("ss")) != 0)
{
    Thread.Sleep(500);
}
int Counter = Convert.ToInt32(project.Variables["Counter"].Value);
project.Variables["Counter"].Value = Convert.ToString(Counter + 300000);
Он будет ждать пока секунды не будут равны нулю. Тип если цикл закончится в 00:35:17 он будет ждать до 00:36:00 перед тем как уйти на паузу в 5 минут.
 
Последнее редактирование:

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
Тогда во втором сниппете надо вот на это заменить.

C#:
while(Convert.ToInt32(DateTime.Now.ToString("ss")) > 1)
{
    Thread.Sleep(500);
}
int Counter = Convert.ToInt32(project.Variables["Counter"].Value);
project.Variables["Counter"].Value = Convert.ToString(Counter + 300000);
Он будет ждать пока секунды не будут равны нулю. Тип если цикл закончится в 00:35:17 он будет ждать до 00:36:00 перед тем как уйти на паузу в 5 минут.
Ну и если я правильно понял ждать до 36 минут, а потом уйдёт на паузу в 5 минут?
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 012
Благодарностей
540
Баллы
113
Последнее редактирование:
Регистрация
26.05.2020
Сообщения
461
Благодарностей
164
Баллы
43
A, у меня цикл это целый шаблон, и закончить работу он может в разное время. Грубое ожидание в 300000 не пойдёт
чем на устраивает стандартное расписание зенки?
94400
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
чем на устраивает стандартное расписание зенки?
Посмотреть вложение 94400
запуск по расписанию, требует времени на компиляцию. А мне нужно минимизировать задержку к самому минимуму, надо чтобы проект уже начал проверку в условно15:15:00, не позже Уже сделал решение.
 
Регистрация
26.05.2020
Сообщения
461
Благодарностей
164
Баллы
43

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
А поделиться для потомков, нашедших тему в поиске? )
А я выше написал же, у меня специфическая
Я уже попробовал вот так:

C#:
int a = 60;
int b = Convert.ToInt32(project.Variables["second"].Value);
int pause = (a-b)*1000;
//Пауза
System.Threading.Thread.Sleep(pause);
Вроде работает четко.

Насчёт вашего решения, как я уже говорил, строгая пауза в 5 минут меня не устроит. Т.к. на выполнения цикла может потребоваться чуть больше времени, если данные в базу данных например пришли с задержкой.

Кубик который выше сочинил, в принципе меня устроит. Не красиво, но работает :D

Посмотреть вложение 94396
Вот
просто задача, может кому-то и не надо)
 
  • Спасибо
Реакции: Андрейка2020
Регистрация
26.05.2020
Сообщения
461
Благодарностей
164
Баллы
43
@Voldemar - та настройка, которую я указал, запускает шаблон четко по заданному интервалу, независимо от предыдущего выполнения. Вплоть до того, что второй поток запустит, если предыдущий не был завершен. Но да, иногда это бывает не нужно... А у вас я так понимаю, шаблон зациклен, без остановки на перезапуск цикла уходит в четко обозначенный период?
 

Voldemar

Client
Регистрация
13.04.2014
Сообщения
478
Благодарностей
56
Баллы
28
@Voldemar - та настройка, которую я указал, запускает шаблон четко по заданному интервалу, независимо от предыдущего выполнения. Вплоть до того, что второй поток запустит, если предыдущий не был завершен. Но да, иногда это бывает не нужно... А у вас я так понимаю, шаблон зациклен, без остановки на перезапуск цикла уходит в четко обозначенный период?
Да, мне важно запускать каждые в каждые 0,5,15....55 минут, ровно в 00 секунд, без каких либо задержек)
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)