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

  • Автор темы Автор темы Voldemar
  • Дата начала Дата начала

Voldemar

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

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

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

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

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

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

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

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

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

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


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

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

Задача такая, мне надо, чтобы проект повторял цикл в каждые 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;
            }
 
C#:
Развернуть Свернуть Копировать
            int counter = 0;
            while (true)
            {
                Thread.Sleep(counter);


                //ТВОЙ ЦИКЛ




                counter = counter + 300000;
            }

Можно разжевать дураку, и какая логика работы будет.

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

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

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

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

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

P.S. Блок if else не на своем месте. Он должен быть над Паузой
 
Не имею навыков сделать быстренько, к тому же в полете тестирую гипотизы. Возможно, в будущем и сделаем, но пока так)
Ну я тут слепил кой че) вроде работает)

Создаешь переменную 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
Ну я тут слепил кой че) вроде работает)

Создаешь переменную 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
 
Я уже попробовал вот так:

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
Так он на паузу не уйдет пока цикл ваш не выполниться. Видимо я не правильно понял
 
Так он на паузу не уйдет пока цикл ваш не выполниться
94397

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

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

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

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

Ну я совсем запутался) Я ведь именно так и сделал, конец, ведет к началу, зациклено все наглухо.
Надо начало заменить на первый сниппет а в конец добавить второй, свич убрать можно. Но да ладно, сделали и сделали)
94398
 
  • Спасибо
Реакции: Voldemar
Ну я совсем запутался) Я ведь именно так и сделал, конец, ведет к началу, зациклено все наглухо.
Надо начало заменить на первый сниппет а в конец добавить второй, свич убрать можно. Но да ладно, сделали и сделали)
Посмотреть вложение 94398
А смысл двух снипетов? К тому же, как я уже сказал 5 минут жесткой паузы мне не пойдёт. Цикл у меня может закончится в 00:35:17 условно если я добавлю +30000 паузы, то в следующий раз начну также в 00:40:17
 
А смысл двух снипетов? К тому же, как я уже сказал 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 минут.
 
Последнее редактирование:
Тогда во втором сниппете надо вот на это заменить.

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 минут?
 
A, у меня цикл это целый шаблон, и закончить работу он может в разное время. Грубое ожидание в 300000 не пойдёт
чем на устраивает стандартное расписание зенки?
94400
 
чем на устраивает стандартное расписание зенки?
Посмотреть вложение 94400

запуск по расписанию, требует времени на компиляцию. А мне нужно минимизировать задержку к самому минимуму, надо чтобы проект уже начал проверку в условно15:15:00, не позже Уже сделал решение.
 
А поделиться для потомков, нашедших тему в поиске? )
А я выше написал же, у меня специфическая
Я уже попробовал вот так:

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
@Voldemar - та настройка, которую я указал, запускает шаблон четко по заданному интервалу, независимо от предыдущего выполнения. Вплоть до того, что второй поток запустит, если предыдущий не был завершен. Но да, иногда это бывает не нужно... А у вас я так понимаю, шаблон зациклен, без остановки на перезапуск цикла уходит в четко обозначенный период?
 
@Voldemar - та настройка, которую я указал, запускает шаблон четко по заданному интервалу, независимо от предыдущего выполнения. Вплоть до того, что второй поток запустит, если предыдущий не был завершен. Но да, иногда это бывает не нужно... А у вас я так понимаю, шаблон зациклен, без остановки на перезапуск цикла уходит в четко обозначенный период?

Да, мне важно запускать каждые в каждые 0,5,15....55 минут, ровно в 00 секунд, без каких либо задержек)
 

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