Lazarus eventfd

OP #4317479
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.
#4317495
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.
OP #4317570
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.
OP #4317575
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
#4317597
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren