Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.105.184] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Привет всем.
В моей программе нужно сделать задержку 0,1 мс, или можно принимать событие таймера через каждые 0,1 мс. Но функции Sleep() и SetTimer() позволяют установить задержку не меньше 1 мс, т.к. в параметрах принимают только целые значения. Как я могу сделать задержку 0,1 мс ? |
Сообщ.
#2
,
|
|
|
сверхточный отсчет времени
оно поможет. класс позволяет измерять время с точностью до микросекунды |
Сообщ.
#3
,
|
|
|
Пусть даже ты сверхточно посчитаешь это время, но задержку в 0,1 миллисекунды никогда не получишь в многозадачной системе. Только дос, rtklinux и прочее.
|
Сообщ.
#4
,
|
|
|
Паровоз
получит, с небольшой погрешностью но получит: из моего примера: void usleep( int mc_sleep) { ulong64 t1 = timer.GetTickCount64(); for(;;) { ulong64 t2 = timer.GetTickCount64(); if( t2 - t1 >= mc_sleep ) return; } } |
Сообщ.
#5
,
|
|
|
Получит... если не дышать на программу... если выполнять ее на высокопроизводительном процессоре... если мало параллельно выполняющихся программ... не шевелить мышкой в конце концов)))
|
Сообщ.
#6
,
|
|
|
Паровоз
не тупи. Sleep в цикле не используется. постоянно GetTickCount вызывается, процесс выполняется и винда не переключится на обработку другого процесса. впринципе процессу можно наивысший приоритет выставить перед вызовом функции задержки а потом вернуть прежний. я таким методом от 50 до 500 микросекунд выдерживал паузы. прога поршивала микруху А24С64 по протоколу I2C а там погрешность в таймаутах не более 30% так что сам считай. |
Сообщ.
#7
,
|
|
|
Цитата progman @ Паровоз не тупи. Sleep в цикле не используется. постоянно GetTickCount вызывается, процесс выполняется и винда не переключится на обработку другого процесса. впринципе процессу можно наивысший приоритет выставить перед вызовом функции задержки а потом вернуть прежний. я таким методом от 50 до 500 микросекунд выдерживал паузы. прога поршивала микруху А24С64 по протоколу I2C а там погрешность в таймаутах не более 30% так что сам считай. а если тут вдруг стартанет высокоприоритетный поток и начнет чтото делать? а если еще хуже - драйвер какойнить вдруг решит пошевелится. в общем такие маленькие задержки с погрешностью 30% получить нереально практически. оно может то работать, то вдруг сбойнуть.. в общем стабильно получать такие задержки нельзя.. |
Сообщ.
#8
,
|
|
|
Цитата LuckLess @ в общем такие маленькие задержки с погрешностью 30% получить нереально практически. оно может то работать, то вдруг сбойнуть.. в общем стабильно получать такие задержки нельзя.. спорно. у меня прога микруху прошивала а на фоне WinAmp играл, и ниче, без сбоев прошиватель пахал. Добавлено хотя согласен, чтобы 100% точно выдерживать надо на уровне драйвера решать такие задачи. |
Сообщ.
#9
,
|
|
|
наваял тут код смешной - но в тему..
задержка в 1/10000 секунды есть int cycles = 0; { const int NumTries = 2;//чем больше - тем дольше и точнее ))))) int tm = 0; for (int i = 0; i < NumTries; ++i) { int rm = GetTickCount (); rm += 1000; while (GetTickCount () < rm) ++tm; } tm /= NumTries; cycles = tm; } cycles /= 10000; cycles *= 2.8; // магический кооффициент для моего компилятора и его текущих настроек //проверка страшных вычислений. int check = 0; int tm = GetTickCount (); for (int i = 0; i < 10000; ++i) { int j = 0; while (j++ < cycles);//задержка ++check; } tm = GetTickCount () - tm; std::cout << "elapsed - " << tm << " miliseconds ------ result = " << check; не воспринимайте только серьезно |
Сообщ.
#10
,
|
|
|
Цитата LuckLess @ не воспринимайте только серьезно [/COLOR] а чо тада не в "Юмор" |
Сообщ.
#11
,
|
|
|
В этих прекрасных методах есть один недостаток. Во время реализации точного метода Sleep() через gettickcount - проц встает раком на 100% загрузки.
|
Сообщ.
#12
,
|
|
|
Большое спасибо за правильный совет. Я им воспользовался. Для моего приложения все работает как нужно. Поэтому дискуссии о том, получу я нужную мне задержку, или не получу - можно остановить, так как необходимую задержку уже получил.
|
Сообщ.
#13
,
|
|
|
Цитата Alexandoros @ В этих прекрасных методах есть один недостаток. Во время реализации точного метода Sleep() через gettickcount - проц встает раком на 100% загрузки. и? а не пофиг повисеть миллисекунду, другую? зато ОС скорее всего не переключит управление на другой процесс |
Сообщ.
#14
,
|
|
|
Действительно, моя прога иногда может и повисеть одну-другую миллисекунды, это не критично, но в целом задержка 0,1мс выдерживается с достаточной для моей проги точностью, так что код, предложенный Progman - позволяет довольно точно выдерживать временные интервалы менее 1мс.
|
Сообщ.
#15
,
|
|
|
progman
Не груби! Нет в твоем методе гарантии, что задержка всегда будет в одну миллисекунду. |