mschnell hat geschrieben:marcov hat geschrieben: postmessage/sendmessage sind Windows Funktionen, und Lazarus hat eine minimale Emulation. Ich kann mich nicht erinnern das ein Developer die Windows Emulation perfekter machen wollte. Es gibt ja Wine für das.
Sorry but Unsinn (immer noch).
Das schöne an Object Pascal ist, dass es eine Event-gesteuerte Sprache ist.
Falsch. VCL/LCL ist Event gesteuert, nicht O. Pascal. (und nein, eine Windows spezifische shortcut wie "message" macht es noch keine Event gesteuerte Sprache)
Dazu wird eine Möglichkeit gebraucht, vom Thread aus ein asynchrones Event im Mainthread auszulösen ohne auf Performance und/oder Latency- tödliches Polling zurückzugreifen.
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.
Hierzu bietet fpc die Konstruktion "Procedure ... Message". (Es wäre natürlich schöner, die Konstruktion Procedure ... Event zu nennen und einen anständigen Event-Typ zu definieren, um die Kompatibilität mit Delphi und Windows zu verschleiern, aber so dumm ist es auch wieder nicht, einen Record mit vier 32-Bit Werten als basis-Event-Type zu verwenden.)
Ja das ist dumm. Was kann man nur mit ein paar 32-bit werte?
Um "Procedure ... Message" zu beschicken wird ein "FireMainThreadEvent" Mechanismus gebraucht. Der heißt bei Lazarus eben "PostMessage". (Es wäre natürlich schöner, die Funktion tatsächlich FireMainThreadEvent() zu nennen und den besagten Event-Typ zu verwenden, um die Kompatibilität mit Delphi und Windows zu verschleiern, aber...).
Das ganze muss natürlich Cross-Plattform implementiert sein.
Natürlich ?? Was ist natürlich daran Windows Systeme auf andere platform zu emulieren? 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.
Es ist klar, dass bei einer Windows-Implementierung die Windows-Message API verwendet wird. Die ist ja nun mal leicht verfügbar.
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)
Auf anderen Plattformen werden natürlich andere Mechanismen verwendet. die LCL hat hier (je) eine Implementierung für KD, GNOM und fpGUI, MSE macht es sogar komplett ohne Anbindung an eine GUI, (Mac: keine Ahnung, wird aber sicherlich funktionieren).
Eine Windows emulation, genau so wie ich sachte.
Aber der meist wichte Punkt, dass es mit TThread.Queue ein wirklich platform unabhaengige Loesung fuer dasselbe problem gibt, darauf hast du nicht kommentiert.