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.
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 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.
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.
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 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.