Minulla on tällainen koodi:
int XXx_XxXx(void *turha) { SDL_Event event; int found; while(XxXxStopper==0) { found=SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION)); printf("%d", found); } /* Kertoo, että XxXx on loppunut */ XxXxStopped=1; return(0); }
Tuo pyörii threadissa. Sen olisi tarkoitus palauttaa 1 aina kun hiiri liikkuu, mutta se antaa vaan kerran 1:n jos hiirtä liikuttaa, ja senkin pitää olla ihan ensimmäinen event. Missävika? (Noiden XxXx-juttujen tilalla on oikeakin nimi, mutta sitä en kerro)
Jos tuo on threadissa niin
while(1) { if(IsKeyPressed()) bNAPPIAONPAINETTU = true; }
Ja samaan aikaan pääthreadissa
while(1) { if(bNAPPIAONPAINETTU) { // tee jotain // pistetään se takaisin falseksi bNAPPIAONPAINETTU = false; } }
Jos käytät samaa muuttujaa threadien välillä tutustu mutexiin
http://www.webopedia.com/TERM/M/mutex.html
http://en.wikipedia.org/wiki/Mutex
Mutta tässä testipätkässä (sama ongelma on myös oikeassa pätkässä) ei tuota näppäimen tilaa tallenneta mihinkään, vaan tarkistetaan että onko eventtiä.
Olethan ottanut huomioon sen, että SDL_PeepEvents() funktio poistaa SDL_GETEVENT toiminnolla AINOSTAAN haetut eventit viestijonosta eli kaikki muut eventit täyttää jonoa ja kun jono on täysi KAIKKI tulevat eventit "hylätään" eivätkä näy jonossa. Mikäli olet ottanut huomioon niin hyvä, jos et niin suosittelisin melkein käymään joka tarkastuskerta kaikki tapahtumat läpi ja jos kohdalle sattuu MOUSEMOTION eventti niin käsittelet sen ja muun laiset eventit ohitat (tällöin eventti jono tyhjenee). Katso http://sdldoc.csn.ul.ie/sdlpollevent.php
Vaikka pistän siihen maskiksi 0xFFFFFFFF niin edelleen sama ongelma. Eikö sen pitäisi olla kaikki maskimahdollisuudet?
Kuten WinC tuossa ehdottaa, kannattaa varmaankin käyttää SDL_PollEvent-funktiota, joka hoitaa kaikki.
Se taas ei ole thread-turvallinen.
Eikö sen pitäs periaatteessa toimia näin:
while (SDL_PeepEvents(&event,1,SDL_GETEVENT,SDL_EVENTMASK(SDL_MOUSEMOTION))) { switch (event.type){ case SDL_MOUSEMOTION: //... }
Ei pitäisi, sen pitäisi kokoajan loopata, riippumatta siitä onko eventtiä vai ei. Tuossa sinun esimerkissäsihän tulee vaan SDL_MOUSEMOTION joten sitten tapahtuu taas se Eventqueuen täyttyminen. Miksei se tuolla minun 0xFFFFFFFF:lläni toimi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.