Особенности языка mql5, тонкости и приёмы работы - страница 100

 
Sleep(0);

Такой слип может выполняться десятки миллисекунд.

 
fxsaber:

Такой слип может выполняться десятки миллисекунд.

что это значит?

помню давно Sleep() упоминался в распараллеливании процессов

 
Fast528:

что это значит?

Ровно то, что сказал.

 
fxsaber:

Такой слип может выполняться десятки миллисекунд.

Не десятки, а 15.625 миллисекунды.
Я давно уже использую конструкцию:

if(pause>0) Sleep(pause);
 
Nikolai Semko:

Не десятки, а 15.625 миллисекунды.
Я давно уже использую конструкцию:

ulong GetSleepTime( const int Pause = 0 )
{
  const ulong StartTime = GetMicrosecondCount();
  
  Sleep(Pause);
  
  return(GetMicrosecondCount() - StartTime);
}

void OnStart()
{
  ulong MaxTime = 0;
  
  while (!IsStopped())
  {
    const ulong SleepTime = GetSleepTime();
    
    if (SleepTime > MaxTime)
    {
      Print(SleepTime);
      
      MaxTime = SleepTime;
    }
  }
}


Результат

2542
9983
10033
10041
10148
10348
11982
26116
27529
40066
49915
56319
 
fxsaber:


Результат

Среднее время посчитайте.

Накопите SleepTime, а после завершения цикла разделите на количество итераций.

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

PS. Функция Sleep() в MQL5 не является редиректом в win api функцию ::Sleep(). Вернее, при значении меньше 100 - это редирект. А больше 100 - уже цикл с вин апи слипом внутри, чтобы можно было прервать по IsStopped.

И ещё есть нюанс. При значении количества миллисекунд <=0 подставляется 1. То есть, мы никогда не вызываем ::Sleep(0)

PPS импортируйте из kernel32.dll функцию Sleep и проведите такой же эксперимент с ней

 
Slava:

Среднее время посчитайте.

Накопите SleepTime, а после завершения цикла разделите на количество итераций.

Речь шла не про среднее время, а про возможность всплесков. С ними столкнулся во время ожидания синхронизации торговой истории с результатом OrderSend. Ждал через Sleep(0). Оказалось, что так нельзя.

Slava:

PS. Функция Sleep() в MQL5 не является редиректом в win api функцию ::Sleep(). Вернее, при значении меньше 100 - это редирект. А больше 100 - уже цикл с вин апи слипом внутри, чтобы можно было прервать по IsStopped.

И ещё есть нюанс. При значении количества миллисекунд <=0 подставляется 1. То есть, мы никогда не вызываем ::Sleep(0)

Спасибо за подробности. Не знал, что Sleep(5000) можно оборвать через IsStopped().

 
fxsaber:

Речь шла не про среднее время, а про возможность всплесков. С ними столкнулся во время ожидания синхронизации торговой истории с результатом OrderSend. Ждал через Sleep(0). Оказалось, что так нельзя.

Так операционная система Виндовс никогда не являлась системой реального времени
 

fxsaber:

Спасибо за подробности. Не знал, что Sleep(5000) можно оборвать через IsStopped().

https://www.mql5.com/ru/docs/common/sleep

В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды.

Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды.
 
Slava:
Так операционная система Виндовс никогда не являлась системой реального времени

Честно говоря, даже не знаю, что это обозначает и где в MQL5 можно с этим столкнуться.