Тогда лучше будет если сделать более развернутый пример, чтобы менее опытным было проще сориентироваться. Я так думаю!
Этот код рекомендую использовать только в экспертах и скриптах!
intOnInit() { //---создадим таймер с периодичностью 1 микросекунда EventSetMillisecondTimer(1);
return(INIT_SUCCEEDED); }
voidOnTimer() { //---укажем ограничение по времени, чтобы таймер давал возможность через каждые 1000 микросекунд //---обрабатываться основным событиям, таким как: OnTick(), OnChartEvent(), OnOnDeinit(), ... constulong ToFinish = GetMicrosecondCount() + 1000;
while(!_StopFlag && GetMicrosecondCount() < ToFinish) { //---тут поместим наши функции, которые должны выполняться "параллельно" и обладать наивысшим приоритетом ParallelFunc1();
Тогда лучше будет если сделать более развернутый пример, чтобы менее опытным было проще сориентироваться. Я так думаю!
Этот код рекомендую использовать только в экспертах и скриптах!
даже если не 1000 а 50000 поставить - все равно заскакивать в OnChartEvent успевает, хотя и с подлагами панель елозится по графику, а вот если 500000 - то уже почти намертво, событие не обрабатывается
Это не удивительно человеческий глаз обрабатывает в среднем 24 кадра в секунду, что 1000000/24 ~ 42000 мкс. Верно?
Нужно еще учесть задержки на переключения между событиями и на выход из таймера (таймаут лишь грубо отсекает время) и прочие мелочи, поэтому смело можно: 42000/3=14000 мкс.
А если еще учесть, что в среднем алгоритмы внутри параллельных функций не такие уж быстрые, то и вовсе остается совсем ничего, т.е. 1000 мкс.
Вы, похоже, хотите распараллелить вычислительный поток? Тут единственный вариант: использовать таймер миллисекндный, цикл и таймаут для вычисления, чтобы все остальное тоже выполнялось:
Да, в виндах интервал переключения потоков как раз 15-16 мс минимум, так что стандартный таймер с меньшим интервалом работать не будет. Может, в 10-ке и меньше сделали, не пробовал. А такой выход с циклом сработает. Кстати, в виндах можно мерять время с точностью до такта процессора, но надо писать DLL.
Alexey Volchanskiy: Да, в виндах интервал переключения потоков как раз 15-16 мс минимум, так что стандартный таймер с меньшим интервалом работать не будет. Может, в 10-ке и меньше сделали, не пробовал. А такой выход с циклом сработает. Кстати, в виндах можно мерять время с точностью до такта процессора, но надо писать DLL.
Это я у Рихтера вычитал. Возможно, в десятке по другому.
Вы же используете таймеры Windows или что-то свое?
Alexey Volchanskiy: Да, в виндах интервал переключения потоков как раз 15-16 мс минимум, так что стандартный таймер с меньшим интервалом работать не будет. Может, в 10-ке и меньше сделали, не пробовал. А такой выход с циклом сработает. Кстати, в виндах можно мерять время с точностью до такта процессора, но надо писать DLL.
не минимум, минимум 1 мс можно выставить, некоторые приложения сами могут менять, например видео проигрыватель. С точностью до такта это все ресурсы процессора будут уходить на расчет таймера ))
Ого, значит все вышло? Круто!
Тогда лучше будет если сделать более развернутый пример, чтобы менее опытным было проще сориентироваться. Я так думаю!
Этот код рекомендую использовать только в экспертах и скриптах!
{
//---создадим таймер с периодичностью 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;
}
Тогда лучше будет если сделать более развернутый пример, чтобы менее опытным было проще сориентироваться. Я так думаю!
Этот код рекомендую использовать только в экспертах и скриптах!
Это не удивительно человеческий глаз обрабатывает в среднем 24 кадра в секунду, что 1000000/24 ~ 42000 мкс. Верно?
Нужно еще учесть задержки на переключения между событиями и на выход из таймера (таймаут лишь грубо отсекает время) и прочие мелочи, поэтому смело можно: 42000/3=14000 мкс.
А если еще учесть, что в среднем алгоритмы внутри параллельных функций не такие уж быстрые, то и вовсе остается совсем ничего, т.е. 1000 мкс.
Вот, как-то так, я думаю :)
Вы, похоже, хотите распараллелить вычислительный поток? Тут единственный вариант: использовать таймер миллисекндный, цикл и таймаут для вычисления, чтобы все остальное тоже выполнялось:
{
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.
Это абсолютно ошибочное утверждение.
Это я у Рихтера вычитал. Возможно, в десятке по другому.
Вы же используете таймеры Windows или что-то свое?
Это я у Рихтера вычитал. Возможно, в десятке по другому.
Вы же используете таймеры Windows или что-то свое?
Да, в виндах интервал переключения потоков как раз 15-16 мс минимум, так что стандартный таймер с меньшим интервалом работать не будет. Может, в 10-ке и меньше сделали, не пробовал. А такой выход с циклом сработает. Кстати, в виндах можно мерять время с точностью до такта процессора, но надо писать DLL.
Это я у Рихтера вычитал. Возможно, в десятке по другому.
Вы же используете таймеры Windows или что-то свое?
Вы перепутали старое утверждение про базовую разрешающую способность функции GetTickCount() в 16 ms с квантом переключения потоков.
Это не имеет никакого отношения к квантам выделения cpu на каждый поток и времени переключения потоков.