Hirdetés

Keresés

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

  • emitter

    őstag

    válasz emitter #1323 üzenetére

    najó elég béna voltam, nem godnolkoztam
    szóval müxik, de nem teljesen úgy ahogy én akarom:

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/time.h>

    int
    input_timeout (int filedes, unsigned int seconds)
    {
    fd_set set;
    struct timeval timeout;

    /* Initialize the file descriptor set. */
    FD_ZERO (&set);
    FD_SET (filedes, &set);

    /* Initialize the timeout data structure. */
    timeout.tv_sec = seconds;
    timeout.tv_usec = 0;

    // select returns 0 if timeout, 1 if input available, -1 if error.
    return select (FD_SETSIZE,
    &set, NULL, NULL,
    &timeout);

    }

    int
    main (void)
    {
    int i=0;
    while(i<10)
    {
    if( input_timeout(STDIN_FILENO, 1) )
    {
    printf(''gomnyomas tortent '');
    printf(''%d\n'',i);
    i++;
    }
    else
    {
    printf(''%d\n'',i);
    i++;
    }
    }
    return 0;
    }


    ugyanis pl. 3 mp-ig várok, ok, számol 3-ig
    aztán nyomok 1 entert, ekkor azt kéne kiírnia, h ''gomnyomas tortent 4''
    majd kéne tovább számolnia, nem?
    ehelyett ezt írja:
    gomnyomas tortent 4
    gomnyomas tortent 5
    gomnyomas tortent 6
    gomnyomas tortent 7
    gomnyomas tortent 8
    gomnyomas tortent 9

    és mindezt 1 pillanat alatt, mintha már nem számolna a timeout :U
    mit rontottam el :F

  • 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