Multimedia Timers & VC++

17 отговора 587 прегледа
#1

Multimedia Timers & VC++

Ако някой е наясно с тия таймери може ли да ме открехне на някой нещица:
1. Те работят с CALLBACK функция. Тя трябва ли да е глобална за приложението или може да е член функция на някой заврян обект?
2. При тях има ли някакъв преоритет? В смисъл като при обектите на приложението. Ако работят два таймера едновременно кой е с по-висок преоритет?
3. До колко са точни? На мен ми трябва разделителна способност 1 ms. Приложението е много критично откъм времеинтервалите.

Отговор
в отговор на Цeцo #2

Че може, може

ама ти си луд такова критично приложение да го стартираш под Windows. Значи дори в NT или 2000 никой не може да ти гарантира сигурен time slot за нещо което ще го изпълнява проца при интервали под 17ms. По-добре да вкараш допълнителен хардуер, който да ти върти нещото с тоя рейт, а PC-то само да менаджира

Отговор
в отговор на Цeцo #3

Re: Multimedia Timers & VC++

Po desain Windows ne e real-time OS, taka che kritichni programni taimeri ne mozesh da suzdadesh (osobeno za 1 ms). Nai-malkoto, shte ti triabva draiver, a i togava ne ti e garantirano mnogo. Windows baziran na VMM e non-preemptive v ring 0 (s malki izkluchenia), i tova shte ti dade malko poveche kontrol otkolkoto v NT.

Отговор
в отговор на Balam #4

Re: Multimedia Timers & VC++

Добре де аз хардуера го имам (USB). Frame rate ми е 1 ms. Имам и Fifo. Имам и драйвери за него. Обаче трябва да го синхронизирам някак това Fifo с рисуването по екрана. С тия мултимедийните таймери не може ли да стане? Освен това е задължително да стане на Windows 9x.

Отговор
в отговор на Цeцo #5

Re: Multimedia Timers & VC++

хм.
ако не ме лъже паметта execution quantum-a на NT-то за foreground e okolo 50-60 ms (за NT Server - 120ms) - тоест през толкова време се swicht-ва между thread-овете, иначе quantuma май беше между 3 и 4 ms
на Linux-a прекъсването от таймера се сетваше да е на 10 ms (=100 пъти в секунда).

някак си не го виждам това 1мс...

по другия въпрос - CALLBACK е еквивалентно на _stdcall; дори и да си сложиш такива calling conventions на функция на класа - няма кой да ти предаде this указателя;
callback функцията за ММ таймерите се вика в отделна нишка (windows-a специално я създава за теб) - така че трябва да се внимава с достъпа до общите данни.

Отговор
в отговор на Цeцo #6

Re: Multimedia Timers & VC++

М-дааа, явно Windows-а си е тромавичко животно. Добре де ами на high resolution timer -ите мога ли да разчитам. Те CALLBACK не могат да викат ама поне за точно отчитане (с разделителна способност 1ms) трябва да стават, а?

Отговор
в отговор на Цeцo #7

Re: Multimedia Timers & VC++

Ako iskash funkciqta da ti e vyv nqkoi klas, si q pravish public i static i i predavash kato parametyr this, a vyv neq si go cast-vash do obekta.

Отговор
в отговор на Цeцo #8

Re: Multimedia Timers & VC++

...pyrwo kakto ti kazaha nito windows nito linux sa real-time OS, taka 4e nikoq ot dwete ne ti garantira to4ni interwali....
....posle ot towa koeto kazwa6 ne wivdam, da ima6 nuvda nito ot period 1 ms nito ot to4en period 1 ms :)...obmisli dobre kakwo iska6 da naprawi6, 6toto towa koeto si go izmislil e glupawo...sorry ne iskam da te zasegna...

Отговор
в отговор на Цeцo #9

Re: Multimedia Timers & VC++

Struva mi se, che na teb ne ti triabva 1ms taimer za da postignesh tova koeto iskash. Purvo, horata koito sa napravili harduera i draiverite za nego sa znaeli vuzmoznostite na Windows i po tazi prichina imash FIFO bufer. Vtoro, dori i da mozeshe da risuvash po ekrana prez 1ms, dosega ne sum chuval za video karta i monitor s 1kHz refresh rate. Taka che niama nikakuv smisul da se opitvash da postignesh takova burzo risuvane. Bih te posuvetval da prerazmislish disaina na programata si predi da si se razocharoval napulno.

Otnosno otchitane na vreme v Windows do 1ms tochnost - tova moze da se napravi. No da go polzvash v programa e nemislimo. Imai v predvid, che Windows shte prekusne programata ti po vsiako vreme, dori i v momenti kogato si otchetul vremeto, no oshte ne si zapochnal da go obrabotvash.

Uspeh

Отговор
в отговор на nobody #10

Re: Multimedia Timers & VC++

Абе сигурно аз не съм се изказал точно. Значи имам USB устройство и некакъв драйвер за него. Сорсовете на драйвера ги немам. Той поддържа stream поток на всяка 1ms в зададен от мен буфер. Проблема е че буфера не е много голям и трябва да се разтоварва често (в рамките на 1 сек). Кофтито е че драйвера е написан кофти и не дава никаква обратна информация за състоянието на буфера. Мога да стартирам Stream да го стопирам и да прочета n байта от него. Аз трябва да разтоварвам буфера ,да филтрирам данните (20 байта на 1 милисек.) и да ги надраскам на екрана и на диска. Буфера обаче не трябва да се препълва щото губя данни без да знам. Затова ми трябва да се активира нишка на точно определено време. Или поне в рамките на определен интервал (1сек.), но да мога точно да измеря времето от последното активиране за да знам какво имам в буфера. Не трябва и да прескоча интервала щото губя данни. Дефакто real-time ще работи само драйвера, а той би трябвало да го може (ебем ти драйвера иначе). Проблема е как да измеря точно времето.

Отговор
в отговор на цeцo #11

Re: Multimedia Timers & VC++

Togava imash dve vuzmoznosti. I v dvata sluchaia triabva da sedish v cikul, i da izdurpvash dannite ot bufera postoianno bez nikakuv taimer. Ako imash bufer head/tail, proveriavai v tozi cikul dali ima danni, i gi iztegliai vednaga. Po broia na dannite mozesh da si izchislish vremeto, ako ti triabva. Ako niamash head/tail, izchisliavai broia na ms mezdu vsiaka iteracia na loop-a, polzvaiki GetTickCount(), i iztegliai dannite na bazata na iztekli ms * baitove za 1 ms.

Отговор
в отговор на Balam #12

Re: Multimedia Timers & VC++

Да де, ама през цялото време трябва да ги филтрирам тия данни цифрово и да ги рисувам по екрана и на диска (в реално време). Така че почти сигурно е , че ще ползвам отделни нишки за това. Как да се застраховам че Win-a ще ми пусне управление на водещата нишка преди да се е препълнил буфера? И да съм в цикъл и да не съм той ще ми стопира нишката когато той реши. А времето не мога ли да го отчитам чрез highresolution таймер?

Отговор
в отговор на Цeцo #13

Виж са

много е просто и хората отдавна са го измислили решението на тоя проблем. Малък ти е буфера казваш? Ми направи си твой, достатъчно голям за да побере данни за 2 сек. и във всеки възможен момент прехвърляй от FIFO буфера на USB в твоя буфер. Оттам нататък къф е проблема? Или ще можеш да обслужваш всички данни или няма да можеш (в зависимост от процесор, стартирани други процеси и т.н.) Факт е че и да изпуснеш няколко пакета не е фатално, на stream video точно там му е силата: при пропускане на пакети качеството не се губи забележимо.

Отговор
в отговор на Цeцo #14

Re: Multimedia Timers & VC++

Ako mozeshe da si osigurish izpulnenie v tochno opredeleni intervali ot vreme, Windows shteshe da bude real-time OS. Uvi, tova ne e taka :( Taka che poslushai suveta na Siluet i si napishi programata po tozi nachin. Moze malko da pomogne ako povishish prioriteta na thread-a, koiato mesti dannite ot USB bufera v tvoia bufer. Ako i tova ne stava, iziskvai po-burzo PC.

Отговор
в отговор на Цeцo #15

REALTIME_PRIORITY_CLASS

При тази стойност процесът има гарантирани 100% от процесорното време, при положение, че му трябват. Така е поне при NT, трябва да пробваш как е при 9х. От там нататък за интервали до 1 мс можеш да си направиш Waitable Timer. За съжаление той не се поддържа от win95 (само от 98 нагоре), затова, ако ти трябва и 95, ще трябва да си чакаш таймаута на обикновен event.
И все пак, сигурен ли си, че драйверът не генерира никакви events?

Si Vis Pacem, Para Bellum
Отговор
в отговор на MиГ-31 #16

Re: REALTIME_PRIORITY_CLASS

Нищо не генерира мръсника (драйвера де). Пробвах го и това с REALTIME_PRIORITY_CLASS и действително на добра машина се справя. Проблема е ,че не знам на каква машина ще работи програмата. А и по неприятното е, че спецификата на проблема е такава, че програмата може веднъж да работи, веднъж не. Зависи oт Win-a кви с какви щуротии ще се занимава в момента. А не трябва да изпускам данни. Това не е цифрово видео. Контролера е с съвсем друга цел.
Абе никой не каза нищо за тия highresolution timer - и. Някой ползвал ли ги е? В MSDN-a пише ,че не всичкия hardware ги поддържа. Това какво значи? От Pentium нагоре ли кво?

Отговор
в отговор на Цeцo #17

Re: REALTIME_PRIORITY_CLASS

Май не са ти ясни нещата. REALTIME_PRIORITY_CLASS е с по-висок приоритет и от системните процеси. Тъй че изобщо не е от значение "Win-a кви с какви щуротии ще се занимава в момента", тъй като той ще се занимава с тях, само ако на програмата ти не й трябва процесорно време.
А ако бързината на обработката на буфера е по-малка от бързината на напълването му - сори, нищо не може да ти помогне.
"тия highresolution timer - и" служат за свръх-прецизно времеизмерване. Ползват се най-често 2 функции: QueryPerformanceFrequency и QueryPerformanceCounter. QueryPerformanceCounter връща брояч, който нараства с 1-ца на всеки 1 / върнатата от QueryPerformanceFrequency стойност секунди.
На моята система с Duron-650, QueryPerformanceFrequency връща стойност 3579545.

Si Vis Pacem, Para Bellum
Отговор
в отговор на Цeцo #18

Re: Multimedia Timers & VC++

Бе не съм господ не споря. Ама това с преоритета на процеса ми е ясно (поне така си мисля). Обработката на буфера я правя така както казваш, и това е ясно. Целия проблем ми беше как точно да разбера колко време е минало от последното активиране на нишката с точност до 1 милисек. И обще взето идеите тук ми помогнаха. Просто ме занимава въпроса тия високоразделителни таймери на какви машини се въдят. Има ли ги на по-простичките? Мерси за инфото дотук!

Отговор