read(...) mit timeout unterbrechen...
-
Hi,
Suche nach einer möglichkeit, die Funktion read(...) nach xxx ms (timeout) zu unterbrechen.
fcntl(rc, F_SETFL, O_NONBLOCK); if(read(rc, &ev, sizeof(ev)) == sizeof(ev)) { .... }
mir selber ist leider noch nichts vernünftiges eingefallen...
-
wenn du eine Frafikbibliothek benutzt, kannst du die Zeit mithilfe der Frames messen; und zwar in dieser Vorgehensweise
1. GB wid initialisert
...
2.funktion startet
Die Zeit die seit der Intialisierung der GB vergangen ist wird in einer Variable gespeichert
3. du lässt den Rest der Funktion in einer While-schleife durchlaufen
z.b. so:while (AktuelleZeitBeiInitialiserung - ZeitSeitInitialiserungBeiFunktionsbeginn <= xxx) { ... }
du kannst meines wissens Grafikbibliotheken auch bei normalen Windows-Funktionen bzw. Konsolenanwendungen benutzen
-
Wir sind im Linux Tread....deshalb suche ich nach Lösungen für Linux. Und eine Grafik-bibliothek benütze ich nicht, muss alles ohne gehen.
Denke ich muss mir was mit alarm() oder mit pthread was zusammenbasteln.
-
H-Progger schrieb:
Wir sind im Linux Tread....deshalb suche ich nach Lösungen für Linux. Und eine Grafik-bibliothek benütze ich nicht, muss alles ohne gehen.
Denke ich muss mir was mit alarm() oder mit pthread was zusammenbasteln.
Nimm select. Das hat einen Timeoutparameter.
-
select kenne ich noch nicht...werde mal suchen gehen, was ich darüber finde.
Danke dir für deinen Tipp.
-
Ich verwende poll dazu. Ich setze meinen Filedeskriptor mit "fcntl(fd, F_SETFL, O_NONBLOCK);" in den nicht blockierenden Modus und verwende folgenden C++-Code (aus einer Bibliothek, die ich mal geschrieben und veröffentlicht habe, aber hier leider nicht nennen darf
):
Stream::size_type Stream::read(char* buffer, Stream::size_type bufsize) const { ssize_t n; do { n = ::read(getFd(), buffer, bufsize); } while (n <= 0 && errno == EINTR); if (n <= 0) { // no data available if (errno == EAGAIN) { doPoll(POLLIN); do { n = ::read(getFd(), buffer, bufsize); } while (n <= 0 && errno == EINTR); if (n < 0) throw Exception(errno, "read"); } else if (errno != 0 && errno != ECONNRESET) throw Exception(errno, "read"); } return n; }
Und hier die doPoll-Methode:
short Socket::doPoll(short events) const { struct pollfd fds; fds.fd = getFd(); fds.events = events; int p = ::poll(&fds, 1, getTimeout()); if (p < 0) throw Exception("poll"); else if (p == 0) throw Timeout(); else if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) throw Exception("poll"); return fds.revents; }
Wenn Du C verwendest, dann musst Du bei der Fehlerbehandlung natürlich einen anderen Weg suchen, aber Du erkennst das Muster.
Tntnet
-
aber hier leider nicht nennen darf
-
Denke damit komme ich zurecht, danke dir für dein Beispiel.