rovid ideju idozitesek PC-n
Tantos Andras
andras_tantos at tantos.homelinux.org
Tue Dec 17 19:32:28 CET 2002
Hali!
Amit en csinalnek, az az, hogy a programomnak lenne egy az idozitesekkel
foglalkozo thread-je. Nem t'om pontosan mit szeretnel, de modjuk a feladat
byteok soros kikuldese megfelelo idozitesekkel. Akkor a thread 1 byte-ot
kuld ki, szepen bitenkent, ahogy kell, majd alszik amig a kovetkezo byte
megjon. A program tobbi resze meg adja szepen az adatokat ennek a
thread-nek. A trukk az, hogy a soros kommunikacio thread-jenek a prioritasat
meg kell novelni. Erre a
BOOL SetThreadPriority(
HANDLE hThread,
int nPriority
);
hivas valo a THREAD_PRIORITY_TIME_CRITICAL parameterrel. Ez szerintem eleg.
Ha nem akarsz multi-threaded programmal bibelodni, hivd meg a programod
elejen ezt:
BOOL SetPriorityClass(
HANDLE hProcess,
DWORD dwPriorityClass
);
A parameter legyen:
REALTIME_PRIORITY_CLASS
Process that has the highest possible priority. The threads of the
process preempt the threads of all other processes, including
^^^^^^^^^
operating system processes performing important tasks. For
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
example, a real-time process that executes for more than a very brief
interval can cause disk caches not to flush or cause the mouse to be
unresponsive.
De ezzel nagyon figyelj oda, konnyen gyorsan le lehet fagyasztani a gepet.
Ha ezt hasznalod, ahol mar az idozites nem olyan fontos, altasd el a
programodat egy kis idore (Sleep(0)) hogy masok is szohoz jussanak. Ennel a
beallitasnal ugyanis a processzed prioritasa magasabb, mint az OS-e! azaz
pl. a disk-muveletek sem fognak megtortenni. Meg valami: ha ezt a megoldast
valasztod, en azt tennem, hogy minden adatot behuznek memoriaba, a memoriat
'lock'-olnam, hogy ne legyen virtualis memoria-muvelet sem, ezek *utan*
emelnem csak meg a program prioritasat, csinalnam, amit kell, majd amint
lehet vissza vennem a prioritast normal-ra.
Meg par megjegyzes: a programot alaposan debug-old ki prioritas-emeles
nelkul. Nezd at a programot haromszor: az emelt prioritasu resz nem kerulhet
veletlen ciklusba! Akkor sem, ha a kulso HW hulyeseget valaszol, nem
valaszol, barmit csinal. Soha! Lehet, hogy az egesz Win9x alatt nem fog eleg
jol menni, az (ujabb) NT-knek sokkal jobb utemezoje van. Ha viszont NT alatt
futtatod a programot, gond lesz a port eleresevel. Hasznald, a 'UserPort'
nevu programot vagy mas ekvivalens megoldast. Szinten NT alatt csodalkoznek,
ha nem kellene admin jog ahhoz, hogy a process-ed prioritasat ilyen magasra
allitsd. A leiras ennyit mond errol:
Windows NT/2000/XP: The handle must have the PROCESS_SET_INFORMATION access
right. For more information, see Process Security and Access Rights.
Hogy pontosan kinek van ilyen joga, azt nem tudom, az admin-oknak biztos.
> PIC programozot irok w98 ala assemblyben, mar teljesen keszen van, de
> az idoziteseket meg ures ciklussal oldom meg, igy ez gep es
> sebessegfuggove teszi a progit. Szeretnek valami univerzalisan
> hasznalhato otletetet a nagyon rovid (100ns) koruli idozitesekre. A
> portra iras/olvas fix ideig tart vagy az is chipset es sebessegfuggo?
> Valami 4ms koruli idozitesi otlet is kellene, de ezt talan mar le
> tudom trukkosen kezelni.
> Vegso otletkent arra gondoltam, hogy 1s-ig szamoltatok a geppel
> ures ciklusban es ez a szam fog a gep sebessegenek alapjaul szolgalni.
> De ez multitaszkos kornyezetben nem tunik tul jo otletnek...
> Valaki mas esetleg osszefutott-e ezzel a gonddal?
> A windows WM_TIMER-jet mar probaltam...
Ugy tudom a Windows-k 1ms koruli task-utemezovel dolgoznak. Azaz ennyi
bizonytalansagod minimum lesz, hacsak nem csinalsz valami olyasmit, amit
fent leirtam.
Udv,
Tantos Andras
More information about the Elektro
mailing list