Nicht unbedingt. Ich weiß nicht, wie das in den einzelnen Plattformen implementiert ist, aber ein Lazarus-Programm erzeugt jedenfalls normalerweise nicht dauerhaft 100 % CPU-Zeit und die Latenz scheint auch ganz ordentlich zu sein. Wenn ich mich recht erinnere, verwendet MSE um z.B in Linux ohne GUI einen Timer-Events und "Procedure ..Message" Events zu realisieren einen Mutex zum Warten in der Main-Loop, der bei Auftreten irgendeines Events freigegeben wird. Also jedenfalls kein Polling. Ist eine GUI angebunden ist das natürlich komplizierter, weil die "Sprach-Events" (wie Timer-Events und "Procedure ..Message" Events) mit den GUI-Events gemischt werden müssen. Das macht in Lazarus daer Code des entsprechenden "Widget-Type"s.marcov hat geschrieben:Das ist auch eine art polling. Der centrale Event queue pollt nach messages. Genau wie select. Der einzige Unterschied ist das *nix nur auf file/socket descriptors kann Selecten(), und das der Mechanismus in Windows überall ist durchgeführt.
Wenn ich mich recht erinnere bietet MSE hier auch eine schönere Variante.marcov hat geschrieben:Ja das ist dumm. Was kann man nur mit ein paar 32-bit werte?
Das habe ich nicht gesagt. Ich meinte (1) Lazarus muss einen "FireMainThreadEvent" natürlich kompatiel für alle Platformen anbieten. (2) Wenn das identisch zu Delphi/Windows angeboten wird finde ich es nicht optimal (weil eben nur 4*32 Bit) aber auch nicht extrem störend.marcov hat geschrieben:Natürlich ?? Was ist natürlich daran Windows Systeme auf andere platform zu emulieren?
Lazarus hat aber eben keinen Cross-Plattform "FireMainThreadEvent" Event Mechanismus, der ohne den Thread anzuhalten im Mainthread ein Event auslösen kann, das nach Abarbeitung anderer MainThreadEvents ausgeführt wird. Weder ohne Parameter (wie ein asynchrones "Synchronize": wäre sehr schlecht), noch "anständig" mit einem ordentlichen Event-Typ-Paramter ()wie bei MSE). Oder habe ich es nur noch nicht gefunden ?marcov hat geschrieben:Lazarus hat schon ein System fuer die einfachsten 90%, und dass genügt. Ich denke auch das neue Software sich nicht darauf basieren soll. Reine Legacy und Porting-hilfe.
Das mag durchaus sein. Thread Programmierung ist nur für "advanced Programmers" geeignet. Die sollten die Doku lesen könnenmarcov hat geschrieben:Die Api wirt sehr slecht benutzt. Die meisten kontrolieren die Rueckgabe wert von Postmessage nicht. (was ernsthaft ist mit dynamische allocationen in die Message Parameter, Memory luecke)

Wie ich schon sagte, gibt es bessere Lösungen (Ich glaube z.B. richtige asynchrone Events bei MSE) aber solange keine andere in LCL implementiert ist, ist 4*32 Bit in jedem Fall besser als nichts.marcov hat geschrieben:Eine Windows emulation, genau so wie ich sachte.
OK, Ich denke da nochmal d'rüber nach...marcov hat geschrieben:Aber der meist wichte Punkt, dass es mit TThread.Queue ein wirklich platform unabhaengige Loesung fuer dasselbe problem gibt, darauf hast du nicht kommentiert.
Ich fände aber "Procedure ...Event" mit einem ordentlichen Event-Type in Verbindung mit "FireMainThreadEvent() eine seht gut und intuitiv verwendbare Lösung (Die Grundidee dazu ist übrigens m.E. nicht aus Windows, sondern orientiert sich an Unix "signals".). (BTW.: Mein Lieblings-Thema: Wenn solche gequeuten "Thread-Events" nicht nur im Main Thread sondern auch in anderen Threads möglich wären (das geht übrigens in Delphi, wenn man im Thread ein TApplication instanziiert !) wäre es um so besser.
Gruß und Dank,
-Michael