[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Flushing af stdin



On Wed, 31 May 2000 13:23:22 +0200 (CEST), Mads Bondo Dydensborg wrote:
>On Tue, 30 May 2000, Peter Seidler wrote:
>
>> Ok, måske har jeg lavet lort i den og spildt jeres tid. Her kommer en
>> forklaring:
>> 
>> Jeg vil gøre noget ala følgende...
>> 
>> START
>> 	* Læs første tegn fra stdin.
>> 	* Tøm stdin, så der ikke er nogen tegn tilbage.
>> 	* Behandl det læste tegn.
>> 	* Vent _lidt_ tid og gå til START
>
>OK, det er meget nemmere at forstå, men hvad med at lave:
>
>START
>
>* Læs alle tegn fra stdin
>* Brug det sidst læste tegn til behandling
>* Vent lidt tid og gå til START
>
>> 
>> På den måde vil det tegn, der behandles være indtastet i det sidste tidsrum.
>> På den måde risikerer man ikke, at programmet reagerer på noget personen
>> gjorde for "lang" tid siden (dvs. indtastede måske tre tegn i første
>> tidsrum).
>> 
>
>Som jeg forstod det var du igang med at lave et spil. Hvad med at lave din
>tegn behandling asynkron? Altså at du sådan set læser hver gang du kører
>rundt i dit "main loop". Noget ala det her (total pseudo):
>
>while (spillet kører) {
>  char sidst_læst = 0;
>  while(sidst_læst = noget_på_stdin()); /* noget_på_stdin() skal være 
>                                           non-blocking */	
>  if (0 != sidst_læst) {
>    opdater_spil_tilstand(sidst_læst);
>  }
>  animer(); /* Whatever */
>}

Problemet med ovenstående er at det kører møj-hurtigt (og bruger unødigt
meget processor-kraft, da det jo kører konstant)
Jeg har sådan set lavet noget, der er stort set magen til. Jeg venter dog
1/20 sek (sleep()) i bunden af lykken. Derudover har jeg en counter, der
tæller hvor mange gange, jeg har været igennem den. Efter e.g. 20 gange
er der altså gået 1 sek. og jeg kan rykke klodsen en tand ned
(forstår du? *g*).

Her kommer problemet med, at jeg vil tømme stdin. Jeg læser i hvert
gennemløb kun fra stdin _en_ gang, men hvad hvis brugeren taster to gange
mens jeg sover? -Så kommer jeg bagefter, og der virker ikke så interaktivt.

I.ø. kan problemet næsten løses ved bare at lave det tidsrum man venter i
bunden mindre (hurtigere en folk kan taste).
Jeg ville dog stadig være nødt til at tømme stdin på andre tidspunkter, hvor
spillet ikke giver respond i længere tid (når spilleren laver en linie). 

>
>
>> Det var der mange, der ikke forstod, men folk hjalp alligevel så godt de
>> kunne.
>> 
>> Så begyndte vi at diskutere. Og nu kommer det frygtelige. Jeg har baseret
>> programmet på ncurses. Jeg troede dog, at ncurses' getch() og getchar()
>> svarede til hinanden. midlertid returnerer getch() ERR vorimod getchar
>> giver 0, når der ikke er noget på stdin.
>> Og så gik der lidt kage i den (for mit vedkommende i hvert fald)
>> 
>> Om ikke andet, kunne man så ikke tømme (jeg tør ikke sige flushe :-) stdin
>> som nedenunder via std. getchar()?
>> 
>
>Hvis du bruger ncurses er der formentlig metoder til at håndtere
>tastaturet, som du skulle overveje at bruge, frem for stdlib.

Jeg har hele tiden brugt ncurses og getch(). Jeg troede bare, at getch() og
getchar() gjorde det samme (bortset fra at getch() kan returnere konstanter
som KEY_UP, KEY_DOWN osv.)

>
>prøv f.eks. man curs_getch :
>
>       The getch, wgetch, mvgetch and mvwgetch, routines  read  a
>       character  from the window.  In no-delay mode, if no input
>       is waiting, the value ERR is returned.  In delay mode, the
>       program  waits until the system passes text through to the
>       program.  Depending on the  setting  of  cbreak,  this  is
>       after one character (cbreak mode), or after the first new­
>       line (nocbreak mode).  In  half-delay  mode,  the  program
>       waits  until a character is typed or the specified timeout
>       has been reached.
>
>
>Iøvrigt vil jeg tro at ncurses sætter din stdin/terminal i unbuffered mode
>når du beder om no-delay og cbreak mode - hvilket er et held og gør det
>noget nemmere. (Har aldrig brugt ncurses).

Jeg ved ikke med unbuffered. Alt hvad der indtastes gemmes jo stadig i
keyboard bufferen. Altså, hvis du bruger getch() to gange i træk for du de
to sidst indtastede tegn uanset hvornår de blev indtastet.
(gælder ved brug af cbreak mode og no-delay)

>
>Mads
>
>-- 
>Mads Bondo Dydensborg.                               sslug@sslug
>In a stinging rebuke, a federal judge Monday ruled Microsoft Corp. violated
>the nation's antitrust laws by using its monopoly power in personal computer
>operating systems to stifle competition.
>                        - CNN Financial News April 03, 2000: 7:53 p.m. ET
>


-- 
	Peter Seidler


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:08 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *