Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL_PeepEvents-ongelma

Sivun loppuun

Sharph [08.01.2005 13:52:25]

#

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)

Linkku [08.01.2005 18:55:27]

#

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

Sharph [08.01.2005 20:07:59]

#

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ä.

WinC [09.01.2005 00:18:52]

#

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

Sharph [09.01.2005 07:41:03]

#

Vaikka pistän siihen maskiksi 0xFFFFFFFF niin edelleen sama ongelma. Eikö sen pitäisi olla kaikki maskimahdollisuudet?

Metabolix [09.01.2005 07:49:34]

#

Kuten WinC tuossa ehdottaa, kannattaa varmaankin käyttää SDL_PollEvent-funktiota, joka hoitaa kaikki.

Sharph [09.01.2005 08:14:38]

#

Se taas ei ole thread-turvallinen.

WinC [09.01.2005 14:41:47]

#

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:
                                //...
}

Sharph [09.01.2005 15:06:28]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta