Új hozzászólás Aktív témák

  • Jester01

    veterán

    válasz emitter #1323 üzenetére

    azt mondtad h szedjem ki a temp_failure-t, hát kiszedtem, de így meg a select ha jól látom, nem is hívódik meg sehol

    Persze, mert azt is kiszedted :U Talán azt hagyd benne, a return-nel egyetemben.
    return select (FD_SETSIZE, &set, NULL, NULL, &timeout));

    Már most nem tudom hogyan magyarázzam, ha az elõzõt nem értetted.
    Na még egy próba.
    Nézzük onnan, hogy mit szeretnél:
    1. Ha a felhasználó megnyom egy gombot, akkor arra reagálni akarsz.
    2. Másodpercenként kiírni az idõt.
    3. Közben nem terhelni a processzort.

    A 3. pont miatt meg kell mondani az operációs rendszernek, hogy az 1. és 2. események bekövetkeztekor fusson a progi. Ezt például a select függvénnyel lehet, ami azt tudja, hogy figyel tetszõleges számú fájlleírót megadott ideig. Billentyûleütés akkor van, ha a stdin fájlból van mit olvasni. Ezt szépen meg lehet adni a select-nek. Sajnos azt viszont nem tudja, hogy másodpercenként térjen vissza akkor is ha nincs billentyûleütés, csak várakozási idõt lehet neki megadni. Ezért a 2. pontot kicsit át kell fogalmazni, mégpedig úgy, hogy nem azt mondod, hogy másodpercenként, hanem azt, hogy a következõ másodpercig. Ezt pedig úgy csinálod, hogy minden frissítésnél illetve a select meghívása elõtt lekéred az idõt (a gettimeofday függvénnyel, mert kell a pontosság!) és a timeout értéket ebbõl számolod, értelemszerûen: timeout = elõzõ frissítés + 1mp - aktuális idõ.
    A select visszatérési értéke elárulja, hogy az 1. vagy a 2. feltétel következett-e be, vagyis a felhasználó megnyomott egy gombot (ekkor getch() és eseménykezelés) vagy pedig a várakozási idõ járt le (ekkor idõ frissítése kell.).

Új hozzászólás Aktív témák

Hirdetés