Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » read() mit timeout

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.06.2003, 21:36 Uhr
~MarcDuerner
Gast


Hi,
Ich suche eine Möglichkeit zeichen einzulesen, aber wenn für einige zeit nichts passiert normal weiterzumachen. Leider wartet read() ewig auf input und lässt sich nicht so einfach timeout'ten. ich will nach 200microsec den read() call abbrechen und normal im Program weitermachen. Wie geht das ?

Marc
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.06.2003, 21:50 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich weiss nicht obs da ne bessere Möglichkeit gibt, aber im zweifel kannst du nen Thread benutzen, der den read nach 200 ms killt

Gruss Heiko
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.06.2003, 22:12 Uhr
virtual
Sexiest Bit alive
(Operator)


Unter welchem Betriebssystem?
Unter POSIX Betriebssystem mittels select oder poll,
Unter Windows kA.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.06.2003, 14:28 Uhr
~Marc
Gast


Hi,
ist unter Linux, also hab ich POSIX zu verfügung. select() habe ich ab und an schon mal gesehen, weiss aber nicht wie ich es für diesen Fall benutzen kann? Kannst du mal ein einfaches Bsp für select() oder poll() zeigen? Das ist meine funktion und read() soll nach 200 ms abgebrochen werden.


C++:
int timeout_read(int fd) {
   char ch;

   if( read(fd, &ch, 1) > 0 ) return ch; // abbrechen nach 200 ms

   return -1;
}



Gruß,
Marc
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.06.2003, 16:17 Uhr
virtual
Sexiest Bit alive
(Operator)


Möglicherweise ist es da besser stdin auf nonblocking IO zu stellen:


C++:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>


int main()
{
    char c = 0;
    int counter = 0;

    /* Wir setzen stdin auf non blocking IO */
    fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);

    do
    {
        printf("%d\n", ++counter);
        sleep(1);
    } while (1!=fread(&c, 1, 1, stdin) && 'q'!=c && 'Q'!=c);
}



Allerdings bleibt hier das Problem, daß der Terminaldriver erst in stdin was rein tut, wenn Du Return drückst. Das kannst Du nur umgehen, indem du die Terminalsettings veränderst, da hilft Dir kein Select. Da müsstest du mal nach tcsetattr und tcgetattr schauen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.06.2003, 16:59 Uhr
~Marc
Gast


Hi,
Ich will aber irgendwie sicher stellen, das read() abgebrochen wird wenn es nichts innerhalb von 200ms liest . Ich lese nicht von stdin ein sondern von einem device (maus).

Marc
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.06.2003, 17:29 Uhr
virtual
Sexiest Bit alive
(Operator)


Also ich fnde, daß du in der man Page vom select (man 2 select) doch ein komplettes Beispiel zum Umgang mit diesem Befehl findest. Da wird zwar 5 sekunden gewartet, aber Du brauchst Doch nur den parameter anzupassen. Wo ist denn das konkrete Problem?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: