Forum: PC-Programmierung Lazarus eventfd


von Von K. (klausewitz)


Lesenswert?

Hallo,
ich habe mir jetzt schon einen Wolf gesucht, aber weder im Internet noch 
auf der heimischen Platte so wirklich fündig geworden:
Welche Unit muß ich denn unter Linux in Lazarus einbinden, um die 
Funktion eventfd nutzen zu können?
Weder BaseUnix noch Linux scheinen das mitzubringen.  :(

Hintergrund:
Ich möchte einen Linux-Ersatz für Windows WaitForMultipleObjects(), also 
auf eines von mehreren (unabhängigen) Events warten.
Die "normalen" TEvent aus syncobjs können ja leider immer nur auf ein 
Event warten. Oder doch nicht???
Wollte mir etwas mit eventfd + select basteln -> TPortableEvent für 
Windows+Linux unterschiedlich definiert.
Oder gibt es noch alternative elegantere Lösungen? Das ganze sollte 
später mit möglichst wenig Aufwand auf Windows+Linux laufen.

von Bernd K. (prof7bit)


Lesenswert?

Da würd ich mal auf der fpc-pascal Mailingliste fragen wie man das am 
geschicktesten implementieren könnte, dort findest Du die besten 
Experten für dieses Thema.

Je nachdem was Du da konkret vorhast, auf was genau Du da eigentlich 
warten willst, kann man das eventuell auch schon direkt mit den 
Synchronisationsprimitiven aus der RTL erschlagen.

von Bernd K. (prof7bit)


Lesenswert?

von K. schrieb:
> Die "normalen" TEvent aus syncobjs können ja leider immer nur auf ein
> Event warten. Oder doch nicht???

Das TEvent wird ausgelöst wenn irgendein anderer Thread dessen Methode 
SetEvent aufruft.

von Von K. (klausewitz)


Lesenswert?

Hi,
danke für die schnellen Antworten. Da werde ich mich doch mal mit der
FPC-Mailing-Liste auseinandersetzen müssen...

Konkretes Problem:
Ich will synchron mit einem Netzwerk-Gerät kommunizieren (OK, Sockets,
nächstes Reizthema in Lazarus/WinLinux). Jedenfalls sollte der Thread
schlafen, bis entweder etwas vom Socket kommt ODER er intern eine
Nachricht (welche ein Event triggert) kriegt. Außerdem kriegt der Thread
so auch sein BEENDEN-Signal.
Unter Windows ist das überhaupt kein Problem.
WSA-Event+WaitForMultipleObjects(). Ganz elegant ohne eigene
MessageQueue sogar WSA-Event+MsgWaitForMultipleObjects().
Unter Linux war der Plan mit select(), welches ja auch eventfds und
socketfds kann. Zumindest in der Theorie.
Pollen möchte ich gerne vermeiden, daß frißt nur unnötig Prozessorlast.

von Von K. (klausewitz)


Lesenswert?

Bernd K. schrieb:
> von K. schrieb:
>> Die "normalen" TEvent aus syncobjs können ja leider immer nur auf ein
>> Event warten. Oder doch nicht???
>
> Das TEvent wird ausgelöst wenn irgendein anderer Thread dessen Methode
> SetEvent aufruft.

Ja, das ist schon klar - das ist Plattform-unabhängig  ;)
Mein Problem war, daß die WaitFor-Methode eben immer nur auf das EINE 
zugehörige Event wartet.
Intern wird das auch nur stupide auf irgendwelche BasicEventSetEvent etc 
abgebildet. Wäre halt interessant zu wissen, ob das unter Linux intern 
auf eventfd rausläuft oder etwas anderes nutzt.
Wenn es darauf hinausläuft wäre das Problem ja schon fast von alleine 
gelöst. Dann müßte ich nur die Warte-Routinen ändern

von Bernd K. (prof7bit)


Lesenswert?

von K. schrieb:
> Ich will synchron mit einem Netzwerk-Gerät kommunizieren (OK, Sockets,
> nächstes Reizthema in Lazarus/WinLinux)

Da kann ich übrigens lNet wärmstens empfehlen. Das funktioniert 
wahlweise entweder so daß es in einem GUI-Programm sich in die GUI 
event-loop reinhängt und events auf dem main-thread erzeugt (genauso wie 
die Button-klick-Events und dergleichen) oder alternativ kannst Du es 
auch so verwenden daß Du ein TLEventer-Objekt erzeugst, dieses allen 
Deinen TLHandle-Objekten zuweist, einen Netzwerk-Thread startest und von 
diesem aus in einer Schleife die TLEventer.CallAction Methode aufrufst. 
Die blockiert dann (kannst Dir übrigens aussuchen ob select (Linux, 
Windows) oder epoll (Linux) oder KQueue (BSD) verwendet werden soll) und 
dieses ruft dann bei Bedarf die Event-Handler Deiner TLHandle-Objekte 
auf.

Schau Dir mal den Code der verschiedenen TLEventer Klassen an, die sind 
der Dreh- und Angelpunkt dieses Frameworks.

lNet ist extrem raffiniert ausgeklügelt, ich kann das nur jedem 
wärmstens empfehlen. Leider ist die Dokumentation zwar nicht besonders 
übersichtlich, dafür ist es aber im Innern extrem clever (und eigentlich 
recht einfach und vor allen Dingen sehr schlank, Du brauchst auch je 
nach Bedarf nur ne kleine Handvoll der enthaltenen Units) aufgebaut und 
sobald Du mal durchgestiegen bist wie das Ding tickt wirst Du es lieben.

: Bearbeitet durch User
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.