Citat:
E sad, kako da napravim mrtvu petlju koja ce da radi u realnom vremenu i da bude nezavisna od WM_ poruke koja ce je startovati?
Najbolje thread , mada je i to sistemski zavisno jer imaju svoje prioritete na koje nekad ne mozes direktno da utices ,
bez obizra na flagove koje postavljas sa SetThreadPriority() (THREAD_PRIORITY_HIGH ,NORMAL, itd...)
Petlja u zasebnom thread-u ce se vrteti brzo koliko cpu dozvoljava ...i sa GetTickCount mozes donekle meriti preciznost intervala ,
a sa PeekMessage proveravas samo odredjene win poruke tipa WM_CLOSE da bi uradio neki "clean up" u toku gasenja thread-a
da timer proc. treba da zna kad da se ugasi ...
Sve sto alociras ili iniciras u jednom threadu moras u
istom i da obavis ciscenje,
takodje svaki poziv bilo koje f-je proveravaj na provratnu vrednost ili sa GetLastError() da ne bi doslo do "deadlocka" u timer proc.
Code:
unsigned int WINAPI TimerProc (void* lParam)
{
DWORD dwStart = GetTickCount() ;
while(true)
{
if (PeekMessage(&msg,0,0,0,0))
{
if msg.message == WM_CLOSE)
{
//clean up code
break ;
}
}
DWORD dwCurent = GetTickCount() ;
if(dwCurent - dwStart>= TIMELIMIT )
{
// time period ..
}
else
{
dwStart = dwCurent ;
}
}
return 0;
}
Poruke threadu jedino saljes sa PostThreadMessage() i ona je po prirodi asinhrona (za razliku od SendMessage())
sto ce reci poziv se odmah vraca u tvom user-thread kodu kao i povratna vrednost da li je poruka uspesno poslata :
jer u nekoj sinhronizaciji message queue nije kreiran za pokrenut thread (jer PeekMessage() ili GetMessage inicira kreiranje queue-a)
pa moze i da vrati FALSE . U tom slucaju :
Code:
while (!PostThreadMessage(ThreadID,WM_CLOSE,0,0))
{
// ponavljaj slanje poruke dok thread ne skapira da je dobio .
}
Ni ovo cak nije najjbezbednija metoda jer nekad dodje do "deadlock-a" u threadu pa ce ova f-ja da
se izvrsava beskonacno i zakucace tvoj prog. ("your progam is not responding").
Zato pazljivo sa tredovima ako si bas resen da se igras sa win-apijem ;)
[Ovu poruku je menjao deerbeer dana 14.12.2008. u 03:52 GMT+1]
Viva lollapalooza