Forum: PC-Programmierung Events unter Linux


von Stefan (Gast)


Lesenswert?

Hallo,

wie realisiere ich etwas wie Events (overlapped) unter Windows in Linux?
Ich muss mir eine Funktion bauen in der ein Timeoutwert übergeben wird, 
spätestens nach diesem Timeoutwert soll die Funktion zurückkehren, es 
sei denn das Ereignis tritt vorher ein. In Windows gibt es dazu die API 
Funktion WaitForSingleObject. Gibt es ein Pendant unter Windows?

Stefan

von Peter II (Gast)


Lesenswert?

bei einer Funktion geht es auch unter Windows nicht pauschal.

Um was geht es genau? File-IO, Sockets, Threads?

Vermutlich hilft dir schon poll bzw. select weiter.

von CC (Gast)


Lesenswert?

Stefan schrieb:
> Gibt es ein Pendant unter Windows?

Unter Windows oder Linux?

Meinst Du so etwas wie select() oder poll()?

von Stefan (Gast)


Lesenswert?

Unter Linux; es geht um Threads. Ich habe einen Thread der Daten 
häppchenweise von einer seriellen Schnittstelle sammelt. Unter 
bestimmten Voraussetzungen soll in diesem Thread ein Event gesetzt 
werden, auf das in der besagten Funktion gewartet werden soll. Im 
Windowsslang würde ich im Empfangsthread bei Bedarf ein SetEvent 
aufrufen, und in der Abfragefunktion WaitForSingleObject mit dem 
Timeout...

Stefan

von Peter II (Gast)


Lesenswert?

Stefan schrieb:
> Unter Linux; es geht um Threads. Ich habe einen Thread der Daten
> häppchenweise von einer seriellen Schnittstelle sammelt. Unter
> bestimmten Voraussetzungen soll in diesem Thread ein Event gesetzt
> werden, auf das in der besagten Funktion gewartet werden soll. Im
> Windowsslang würde ich im Empfangsthread bei Bedarf ein SetEvent
> aufrufen, und in der Abfragefunktion WaitForSingleObject mit dem
> Timeout...

Events gibt es so unter Linux nicht. Da musst du dir etwas mit mutex und 
pthread_cond_wait basteln.

von Dr. Sommer (Gast)


Lesenswert?

Verwende nicht blockierendes I/O (fcntl (), F_SETFL, O_NONBLOCKING) und 
select() zum senden/empfangen. Da kannst du dann ein Timeout angeben, 
nach dem select() immer zurückkehrt.

von Peter II (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Verwende nicht blockierendes I/O (fcntl (), F_SETFL, O_NONBLOCKING) und
> select() zum senden/empfangen. Da kannst du dann ein Timeout angeben,
> nach dem select() immer zurückkehrt.

hilft ihm aber nicht weiter. Er will ja im Thread Daten sammeln und dann 
das einen anderen Threads wecken.

von Stefan (Gast)


Lesenswert?

>Da kannst du dann ein Timeout angeben,
>nach dem select() immer zurückkehrt

Das "Event" soll aber eben noch nicht durch den eigentlichen 
Datenempfang auf der Schnittstelle gesetzt werden, eventuell müssen 
mehrere "Pakete" eintreffen und noch ein CRC Check gültig sein. Mit 
anderen Worten muss ich das "Event" selber programmatisch auslösen 
können.

von Rene H. (Gast)


Lesenswert?

Schau Dir mal boost::signal an, das hilft Dir vielleicht.

Grüsse,
René

von Dr. Sommer (Gast)


Lesenswert?

Peter II schrieb:
> hilft ihm aber nicht weiter. Er will ja im Thread Daten sammeln und dann
> das einen anderen Threads wecken.

Ach tatsächlich. Statt events verwendet man unter UNIX pipes; der eine 
Thread sendet einfach dem anderen ein Zeichen darüber wenn er aufwecken 
soll, und dieser reagiert per select() auf das pipe.

von Peter II (Gast)


Lesenswert?

Dr. Sommer schrieb:
> der eine
> Thread sendet einfach dem anderen ein Zeichen darüber wenn er aufwecken
> soll, und dieser reagiert per select() auf das pipe.

Dafür eine Pipe verwenden ist schon etwas viel Overhead.

es gibt dafür ja schon pthread_cond_wait, das ganze muss man nur mit 
einem Mutex kombinieren.

von Stefan (Gast)


Lesenswert?

Alles klar, die pthread_cond_wait Sache sieht doch brauchbar aus. Warum 
man dafür zusätzlich einen Mutex braucht habe ich auf Anhieb nicht ganz 
verstanden, habe aber gesehen dass es genau zu diesem Thema einige 
Artikel gibt...

Vielen Dank!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.