Как увеличить скорость таймера в мт4/5? - страница 2

 
Marat Sultanov:
Ого, значит все вышло? Круто!
да, работает отлично
 

Тогда лучше будет если сделать более развернутый пример, чтобы менее опытным было проще сориентироваться. Я так думаю!

Этот код рекомендую использовать только в экспертах и скриптах!

int OnInit()
{
//---создадим таймер с периодичностью 1 микросекунда
   EventSetMillisecondTimer(1);
  
   return(INIT_SUCCEEDED);
}

void OnTimer()
{
//---укажем ограничение по времени, чтобы таймер давал возможность через каждые 1000 микросекунд
//---обрабатываться основным событиям, таким как: OnTick(), OnChartEvent(), OnOnDeinit(), ...
   const ulong ToFinish = GetMicrosecondCount() + 1000;
  
   while(!_StopFlag && GetMicrosecondCount() < ToFinish)
   {
//---тут поместим наши функции, которые должны выполняться "параллельно" и обладать наивысшим приоритетом
      ParallelFunc1();
      
      ParallelFunc2();
      
      //...
   }
}

void OnDeinit(const int reason)
{
//---удалим таймер
   EventKillTimer();
}


//+------------------------------------------------------------------+
//| "параллельные" функции с наивысшим приоритетом                   |
//+------------------------------------------------------------------+
void ParallelFunc1()
{
}

bool ParallelFunc2()
{
   return true;
}


 

 
Marat Sultanov:

Тогда лучше будет если сделать более развернутый пример, чтобы менее опытным было проще сориентироваться. Я так думаю!

Этот код рекомендую использовать только в экспертах и скриптах!

даже если не 1000 а 50000 поставить - все равно заскакивать в OnChartEvent успевает, хотя и с подлагами панель елозится по графику, а вот если 500000 - то уже почти намертво, событие не обрабатывается
 

Это не удивительно человеческий глаз обрабатывает в среднем 24 кадра в секунду, что 1000000/24 ~ 42000 мкс. Верно?

Нужно еще учесть задержки на переключения между событиями и на выход из таймера (таймаут лишь грубо отсекает время) и прочие мелочи, поэтому смело можно: 42000/3=14000 мкс.

А если еще учесть, что в среднем алгоритмы внутри параллельных функций не такие уж быстрые, то и вовсе остается совсем ничего, т.е. 1000 мкс.

Вот, как-то так, я думаю :) 

 
Marat Sultanov:

Вы, похоже, хотите распараллелить вычислительный поток? Тут единственный вариант: использовать таймер миллисекндный, цикл и таймаут для вычисления, чтобы все остальное тоже выполнялось:

int OnInit()
{
   EventSetMillisecondTimer(1);
   return(INIT_SUCCEEDED);
}

void OnTimer()
{
   ulong ToFinish = GetMicrosecondCount() + 1000;
  
   while(!_StopFlag && GetMicrosecondCount() < ToFinish)
   {
      //Your code...
   }
}

void OnDeinit(const int reason) {EventKillTimer();}
Да, в виндах интервал переключения потоков как раз 15-16 мс минимум, так что стандартный таймер с меньшим интервалом работать не будет. Может, в 10-ке и меньше сделали, не пробовал. А такой выход с циклом сработает. Кстати, в виндах можно мерять время с точностью до такта процессора, но надо писать DLL.
 
Alexey Volchanskiy:
Да, в виндах интервал переключения потоков как раз 15-16 мс минимум, так что стандартный таймер с меньшим интервалом работать не будет. Может, в 10-ке и меньше сделали, не пробовал. А такой выход с циклом сработает. Кстати, в виндах можно мерять время с точностью до такта процессора, но надо писать DLL.
Это абсолютно ошибочное утверждение.
 
Renat Fatkhullin:
Это абсолютно ошибочное утверждение.

Это я у Рихтера вычитал. Возможно, в десятке по другому.

Вы же используете таймеры Windows или что-то свое? 

 
Alexey Volchanskiy:

Это я у Рихтера вычитал. Возможно, в десятке по другому.

Вы же используете таймеры Windows или что-то свое? 

Alexey Volchanskiy:
Да, в виндах интервал переключения потоков как раз 15-16 мс минимум, так что стандартный таймер с меньшим интервалом работать не будет. Может, в 10-ке и меньше сделали, не пробовал. А такой выход с циклом сработает. Кстати, в виндах можно мерять время с точностью до такта процессора, но надо писать DLL.
не минимум, минимум 1 мс можно выставить, некоторые приложения сами могут менять, например видео проигрыватель. С точностью до такта это все ресурсы процессора будут уходить на расчет таймера ))
 
Alexey Volchanskiy:

Это я у Рихтера вычитал. Возможно, в десятке по другому.

Вы же используете таймеры Windows или что-то свое? 

Вы перепутали старое утверждение про базовую разрешающую способность функции GetTickCount() в 16 ms с квантом переключения потоков.

Это не имеет никакого отношения к квантам выделения cpu на каждый поток и времени переключения потоков.