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
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.
Stefan schrieb: > Gibt es ein Pendant unter Windows? Unter Windows oder Linux? Meinst Du so etwas wie select() oder poll()?
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
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.
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.
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.
>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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.