Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];
ВнизQueryPerformanceFrequency задать временной интервал Найти похожие ветки
← →
Evgengold (2009-01-22 18:07) [0]Добрый вечер. У меня такой вопрос нужно задать время на выполнение определенной опреции с точностью до микрсек. Для этого использую функцию QueryPerformanceFrequency и QueryPerformanceCounter. Не нашел нормального описания ип риходится эксперементировать.
Написал код программы но она не выподлняет задержки. В чем может быть ошибка и как использовать эти функции. Большое спасибо
For i7:=1 to 10000 do
begin
QueryPerformanceFrequency(tFreq);
QueryPerformanceCounter(tBegin);
EscapeCommFunction(hPort, SETDTR); // выполнение первой команды
While (tEnd - tBegin) / tFreq <0.000026 do QueryPerformanceCounter(tEnd);
EscapeCommFunction(hPort, CLRDTR);// выполнение второй команды
QueryPerformanceFrequency(tFreq);
QueryPerformanceCounter(tBegin);
While (tEnd - tBegin) / tFreq <0.000026 do
QueryPerformanceCounter(tEnd);
end;
← →
Jeer © (2009-01-22 18:13) [1]Если Вы о настольных версиях Windows, то эта ОС не является системой реального времени.
← →
evgengold (2009-01-22 20:00) [2]Да! но тем не менее Можно подказать как правильно пользоваться этой функцией!
← →
Сергей М. © (2009-01-22 20:27) [3]
> evgengold (22.01.09 20:00) [2]
Вот ты ж фома неверующий)
Ну не получишь ты требуемой тебе прецизионности !
Это в который уже раз тебе сказано - вне ОСРВ или хотя бы без привелегий реального времени в мультизадачной ОС все попытки получить временные выдержки такой точности заведомо обречены на провал.
← →
Германн © (2009-01-23 00:48) [4]
> Это в который уже раз тебе сказано - вне ОСРВ или хотя бы
> без привелегий реального времени в мультизадачной ОС все
> попытки получить временные выдержки такой точности заведомо
> обречены на провал.
Вроде как у некоторых получается. Ибо нужны короткие пакеты импульсов. Но эти "некоторые" довольно опытные люди (как в знании железа и ОС, так и в программировании). А автор и СОМ-порт ещё только начал осваивать. И разбираться в тех примерах кода, которые есть в И-нете, сам не хочет. :(
Кто-то ему сказал, что такое легко сделать "с наскока".
← →
Evgengold (2009-01-23 10:55) [5]Зря вы меня раскритиковали! Задержка работает на микросекундах нормально даже при изменении загрузки процессора. конечно есть небольшие отклонения но меня устраивает а ошибка у меня была простая.
Вот нормальный код
tEnd:=0;
For i7:=1 to 1000000 do
begin
QueryPerformanceFrequency(tFreq);
QueryPerformanceCounter(tBegin);
EscapeCommFunction(hPort, SETDTR);
While (tEnd - tBegin) / tFreq <0.000011 do // Задержка 11 микросек
begin
QueryPerformanceCounter(tEnd);
end;
QueryPerformanceFrequency(tFreq);
QueryPerformanceCounter(tBegin);
EscapeCommFunction(hPort, CLRDTR);
While (tEnd - tBegin) / tFreq <0.000011 do // Задержка 11 микросек
begin
QueryPerformanceCounter(tEnd);
end;
end;
← →
Сергей М. © (2009-01-23 11:11) [6]Сегодня работает, а завтра перестанет.
Ибо в системе может быть активным процесс, который имея соответствующие привелегии и приоритет возжелает получить (и получит !) непрерывный квант времени в десятки или сотни микросекунд, что неминуемо приведет к фиаско твою "фомологику" и, как результат, к неработоспособности твоего алгоритма)
← →
Jeer © (2009-01-23 11:28) [7]
> Evgengold (23.01.09 10:55) [5]
>
> Зря вы меня раскритиковали!
Тебе не критиковали, для этого ты еще не дорос :)
Просто указали на ограниченность платформы для работы в реал-тайм.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c