Бесконечный цикл с временным интервалам

 

Прошу помощи в решении задачи!

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

Сами вычисления в цикле могут быть долгими, до нескольких минут.

 
Aleksey Vyazmikin:

Прошу помощи в решении задачи!

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

Сами вычисления в цикле могут быть долгими, до нескольких минут.

Посмотрите функцию
void OnTimer()
 

После завершения расчётов прибавляйте к текущему времени столько секунд сколько нужно ожидать.

static datetime time_wait;

while(true)
{
   if(TimeLocal()>=time_wait)
   {
      .... Выполнили расчёты и устанавливаем новое время, повтор через 10 секунд
      time_wait=TimeLocal()+10; 
   }
}
 
Alekseu Fedotov:
Посмотрите функцию
void OnTimer()

Забыл сказать, что это мне нужно для скрипта.

 
Alexey Valeev:

После завершения расчётов прибавляйте к текущему времени столько секунд сколько нужно ожидать.

Спасибо, попробую.

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

 

Есть еще функция Sleep.

Процессор она не грузит. Если просто написать While( true ), то скрипт займет целиком ядро процессора. Если там поставить хотя бы Sleep( 0 ), то нагрузка резко снижается.

 
Ilya Baranov:

Есть еще функция Sleep.

Процессор она не грузит. Если просто написать While( true ), то скрипт займет целиком ядро процессора. Если там поставить хотя бы Sleep( 0 ), то нагрузка резко снижается.

Излагайте свою мысль дальше... пока не понял.

 
while ( true ) {}

Ядро загружено на 100%


while ( true )
{
	Sleep( 0 );
}

Ядро загружено на ~0%


Соответственно:

datetime nextCheckTime = 0;
while ( true )
{
	if ( TimeLocal() > nextCheckTime  )
	{
		... долгие вычисления
		nextCheckTime = TimeLocal() + period;
	}
	else
		Sleep( 0 );
}

Это будет запускаться с фиксированными паузами между запусками.

Если нужно с фиксированным периодом между запусками долгие вычисления перенесите после nextCheckTime = ...

Пока идет пауза - нагрузка на процессор отсутствует.

Но если паузы большие, то можно писать Sleep( 10000 ) и т.п.

 
Ilya Baranov:

Ядро загружено на 100%


Ядро загружено на ~0%


Соответственно:

Это будет запускаться с фиксированными паузами между запусками.

Если нужно с фиксированным периодом между запусками долгие вычисления перенесите после nextCheckTime = ...

Пока идет пауза - нагрузка на процессор отсутствует.

Но если паузы большие, то можно писать Sleep( 10000 ) и т.п.

Спасибо, вроде как получилось! Правда выходит из цикла не сразу при удалении скрипта подтупляет.

 
while ( ! IsStopped() )
{
	...

Остальное то же самое

 
Ilya Baranov:

Остальное то же самое

Спасибо! Действительно, тестовое удаление скрипта прошло значительно быстрей.

Причина обращения: