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
 |
 |
 |
| |
|
|
 |
| |
|
Fel och synpunkter angående webb-sidorna skickas till <www_admin>.
|
Senaste ändring
2005-08-10, klockan 20:08
Denna sidan underholds av
MHonArc
.
|
|
|
 |
 |
 |