WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Малый интервал времени

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Малый интервал времени
zlelik опубликован 07-05-2001 22:17 MSK   Click Here to See the Profile for zlelik   Click Here to Email zlelik  
Как сделать чтобы определенная функция вызывалась через равные промежутки времени, скажем 50 мкс, без прерываний и т.д.
И если она не успевает, то ее выполнение обравылось бы и она вызывалась бы заново
Kosha опубликован 08-05-2001 03:30 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Ставишь мультимедиа - таймер:

if (timeGetDevCaps(&timecaps, sizeof(TIMECAPS)) != TIMERR_NOERROR)
{
MessageBox("Невозможно определить возможности таймера.",
"Ошибка таймера.",MB_OK|MB_ICONERROR|MB_APPLMODAL);
return;
}

wTimerRes = min(max(timecaps.wPeriodMin, DEFAULT_TIMER_RESOLUTION),
timecaps.wPeriodMax); //Определяем разрешение таймера

timeBeginPeriod(wTimerRes); //Ставим разрешение таймера.


//Делаем таймер.
wTimerID=timeSetEvent(wTimerDelay,wTimerRes,TimerCallback,(DWORD)this,TIME_PERIODIC);
//Где TimerCallback - функция, которая будет вызываться.
// wMuscleGraphTimerID=timeSetEvent(wMuscleGraphTimerDelay,wTimerRes,TimerCallback,(DWORD)this,TIME_PERIODIC);;

if (wTimerID==NULL)
{
MessageBox("Невозможно создать таймер.",
"Windows multimedia timer error",MB_OK|MB_ICONERROR|MB_APPLMODAL);
return;
}

}


В общем, это работает как часы...


Kosha опубликован 08-05-2001 03:34 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Тьфу, скобку лишнюю поставил...

ЗЫ: TimerCallback - тоже хитрая функция, так как пускается в отдельном потоке.
(==>указатели на CWnd будут валиться на Assert'ах, если будут проблемы, спрашивай ;-)))

zlelik опубликован 10-05-2001 23:12 MSK     Click Here to See the Profile for zlelik  Click Here to Email zlelik     
А в каких единицах ставится разрешение таймера?
Kosha опубликован 11-05-2001 02:32 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Ну это так называется, на самом деле это точность. Ставится в миллисекундах, и отвечает за +-(x мс) вызывание таймера (т.е. чем меньше, тем точнее. Хотя к задержке (Delay) это абсолютно никакого отношения не имеет ;-))))))))

Приведенный код ставит разрешение по самому крутому, что можно выжать из системы...

zlelik опубликован 12-05-2001 00:20 MSK     Click Here to See the Profile for zlelik  Click Here to Email zlelik     
Так я не понял, мне надо с точночтьсью до микросекунд 1e-6 cек. А там вроде как до милисекунд?
Kosha опубликован 13-05-2001 00:26 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Есть такая буква! (c) ;-)))))

Тебе тогда надо (правда, через задний проход, но сам так делаю, вроде работает)
сделать HardwareTimer (в MSDN написано, что на некоторых тачках отсутствует. Не встречал таких;-)))) ).

вот кодик:
здесь - функция отдельного потока.

UINT ThreadProc(LPVOID pParam)
{
CCriticalSection criticalsection; //для корректности
CSingleLock singlelock(&criticalsection);

LARGE_INTEGER PerformanceCounterLast;
LARGE_INTEGER PerformanceCounterCurrent;
LARGE_INTEGER PerformanceFrequency;
LARGE_INTEGER PerformanceDelta;
float SecondsPassed=0;

PerformanceCounterLast.QuadPart=0;
PerformanceCounterCurrent.QuadPart=0;
PerformanceFrequency.QuadPart=0;
PerformanceDelta.QuadPart=0;

QueryPerformanceFrequency(&PerformanceFrequency);
QueryPerformanceCounter(&PerformanceCounterCurrent);

while (/* Чего-нибудь ;-)*/ )
{
QueryPerformanceCounter(&PerformanceCounterCurrent);

PerformanceDelta.QuadPart=PerformanceCounterCurrent.QuadPart-
PerformanceCounterLast.QuadPart;
if ((PerformanceDelta.QuadPart)>50)
{ //Если ~0, то просто время еще не подошло (ну, например,
//если поток только запущен
SecondsPassed=( (float)PerformanceDelta.QuadPart)/
( (float)PerformanceFrequency.QuadPart);

if (SecondsPassed>=/*ТУТ-КАКОЕ-ТО-ЧИСЛО*/)
{
PerformanceCounterLast=PerformanceCounterCurrent;
singlelock.Lock();

//Тут твоя функция

singlelock.Unlock();
}

}
Sleep(0); //отдаем оставшееся время другому потоку
}

return 0;
}


СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.