LARGE_INTEGER cntbeg, cntend;
__int64 delay, freq, delaycnt;
delay = 20; //(микросекунд)
if (!QueryPerformanceFrequency(&freq))
//error не поддерживается платформой.
return 1;
delaycnt = freq.QuadPart * delay / 1000000;
QueryPerformanceCounter(&cntbeg);
for(QueryPerformanceCounter(&cntend);
(cntend.QuadPart - cntbegin.QuadPart) < delaycnt;
QueryPerformanceCounter(&cntend));
Таймер в C/c++
Мне нужно вызывать функцию с интервалом порядка нескольких микросекунд, соответственно SetTimer() использовать бесполезно (минимальный интервал для этой функции порядка нескольких миллисекунд), подскажите пожалуйста чЁ-нибудь:)
Цитата:
Originally posted by AlexKar
Мне нужно вызывать функцию с интервалом порядка нескольких микросекунд, соответственно SetTimer() использовать бесполезно (минимальный интервал для этой функции порядка нескольких миллисекунд), подскажите пожалуйста чЁ-нибудь:)
Мне нужно вызывать функцию с интервалом порядка нескольких микросекунд, соответственно SetTimer() использовать бесполезно (минимальный интервал для этой функции порядка нескольких миллисекунд), подскажите пожалуйста чЁ-нибудь:)
С микросекундными интервалами работает multimedia timer см раздел Multimedia Timers в Platform SDK
Код:
Этот код даст задержку на микросекунды, но если ты его будеш в цикле юзать, скорее всего у тебя процик загрузится на 100%.
Я знаю что паузу, без загрузки проца, можно запрограммировать через APIC, но под виндой вряд ли удастся.
Цитата:
Originally posted by Alexandoros
Неа, мультимедиа таймер работает с милисекундами. Как поставить таймер на микросекунды в виндовсе, я не знаю, но как вариант попробуй QuerryPerfomanceCounter.
Этот код даст задержку на микросекунды, но если ты его будеш в цикле юзать, скорее всего у тебя процик загрузится на 100%.
Я знаю что паузу, без загрузки проца, можно запрограммировать через APIC, но под виндой вряд ли удастся.
Неа, мультимедиа таймер работает с милисекундами. Как поставить таймер на микросекунды в виндовсе, я не знаю, но как вариант попробуй QuerryPerfomanceCounter.
Код:
LARGE_INTEGER cntbeg, cntend;
__int64 delay, freq, delaycnt;
delay = 20; //(микросекунд)
if (!QueryPerformanceFrequency(&freq))
//error не поддерживается платформой.
return 1;
delaycnt = freq.QuadPart * delay / 1000000;
QueryPerformanceCounter(&cntbeg);
for(QueryPerformanceCounter(&cntend);
(cntend.QuadPart - cntbegin.QuadPart) < delaycnt;
QueryPerformanceCounter(&cntend));
__int64 delay, freq, delaycnt;
delay = 20; //(микросекунд)
if (!QueryPerformanceFrequency(&freq))
//error не поддерживается платформой.
return 1;
delaycnt = freq.QuadPart * delay / 1000000;
QueryPerformanceCounter(&cntbeg);
for(QueryPerformanceCounter(&cntend);
(cntend.QuadPart - cntbegin.QuadPart) < delaycnt;
QueryPerformanceCounter(&cntend));
Этот код даст задержку на микросекунды, но если ты его будеш в цикле юзать, скорее всего у тебя процик загрузится на 100%.
Я знаю что паузу, без загрузки проца, можно запрограммировать через APIC, но под виндой вряд ли удастся.
Про микросекунды я действительно загнул.
Но предложение с QueryPerformanceCounter() - это задержка с полной загрузкой процессора.
Ребята, БОЛЬШОЕ спасибо выручили :}