![]() |
PostMessage mit WndProc oder WMCopyData/Record aus Thread für GUI-Aktualisierung?
Vor einiger Zeit war es noch OK, dass ich mit PostMessage Daten aus einem Thread an WndProc geschickt habe. Funktioniert wunderbare und ich bin Synchronize() losgeworden.
Ich stelle mir jetzt aber ein paar Kernfragen: Synchronize aus einem Thread heraus Sychronisiert mit dem Hauptthread. Grob gesagt kann ich dann den zweiten Thread auch komplett weglassen wenn doch eh synchronisiert wird. Wie sieht das aus, wenn man PostMessage verwendet und die Daten in WndProc (andere Unit) auswertet und dort die GUI aktualisiert. Wird dann auch mit dem Hauptthread synchronisiert bzw. IST DAS überhaupt besser? Synchronize ist weg, das war mein Ziel. Ich möchte nun gerne auch Zeichen ketten schicken können. Dafür würde ich bei PostMessage bleiben, aber WndProc durch WMCopyData(var msg: TWMCopyData); austauschen, sodass ich Records schicken kann und flexibler bin. Hat das gravierende Nachteile? Wenn ja, wie sonst Daten aus einem Thread heraus schicken, sodass man die GUI aktualisieren kann ohne Synchronize verwenden zu müssen? |
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Zitat:
gruss |
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Ich weiß nicht ob deine Frage ernst gemeint ist.
Wenn nicht und es Ironie ist, ignoriere ich sie einfach mehr oder weniger gekonnt. |
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Zitat:
Ja sie ist ernst gemeint. WM_COPYDATA: WM_COPYDATA ist ein Message die in der Winproc ausgewertet wird aber du möchtest die WinProc entfernen bzw. damit austauschen? Wie geht das. gruss |
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Wie wärs denn so? Ich kapiere noch immer nicht wieso du diese Frage gerade stellst.
Delphi-Quellcode:
So kann ich senden was ich will. Nur frage ich mich: besser das unflexible WndProc-Event nutzen oder das deutlich flexiblere WMCopyData (ersteres mit PostMessage, letzteres mit SendMessage).
type
TPostMessageData = record sString: string; sInt: Integer; end; PPostMessageData = ^TPostMessageData; Button1Click(Sender: TObject); var CopyData: TPostMessageData; begin CopyData.sString := 'String test'; CopyData.sInt := 99; SendMessage(Handle, WM_COPYDATA, 0, Integer(@CopyData)); end; procedure TFormReceiver.WMCopyData(var msg: TWMCopyData); begin ShowMessage(PPostMessageData(msg.CopyDataStruct).sString); end; Aus einem Thread heraus. Wenn ich das richtig verstanden habe, blockiert SendMessage den Thread erst einmal. Auch wenn es nicht lange ist. PostMessage, da asynchron, macht das wohl nicht. |
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Zitat:
Das ist schlicht weg falsch und nicht möglich. Du kannst deine eigene Message Queue aus dieser ableiten aber die Winproc austauschen vergiss es. Lese doch einfach mal was du geschrieben hast. Zitat:
Sendmessage wartet auf die Rückgabe PostMessage eben nicht! Bin raus! gruss |
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Zitat:
Ich muss auf keine Rückgabe warten. Ich möchte einfach nur die GUI aus einem Thread heraus aktualisieren ohne Synchronize verwenden zu müssen :P WndProc zusammen mit Record und PostMessage:
Delphi-Quellcode:
Was ist denn davon zu halten einen ganzen Record zu übergeben und immer mit New einen anzulegen?procedure TForm1.Button1Click(Sender: TObject); var CopyData: PPostMessageData; begin CopyData := New(PPostMessageData); CopyData.sString := 'String test'; CopyData.sInt := 99; PostMessage(Handle, 50, 0, Integer(CopyData)); end; procedure TForm1.WndProc(var msg: TMessage); begin case msg.msg of 50: begin ShowMessage('WndProc: ' + PPostMessageData(msg.LParam)^.sString); end; end; inherited; end; |
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Zitat:
Delphi-Quellcode:
irgendwelche Probleme bereitet, oder warum wolltest du das loswerden?
Synchronize
Zitat:
Zitat:
![]()
Delphi-Quellcode:
vergleichen (hierbei läuft der aufrufende Thread auch weiter; anders als beim
TThread.Queue
Delphi-Quellcode:
).
TThread.Synchronize
|
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Zitat:
Nachdem ich sehr viel in WndProc ausgelagert habe und PostMessage verwende, ist der Unterschied deutlich spürbar. Zitat:
Mein Ziel ist es, alle Synchronize und Queue aus den Threads zu bekommen. Daher habe ich mir das da oben mal zusammengestrickt. Record > PostMessage > WndProc. Frage ist nur, ob das in Ordnung ist? |
AW: PostMessage mit WndProc oder WMCopyData/Record aus Thread heraus?
Zitat:
WndProc und ![]()
Delphi-Quellcode:
bzw.
TThread.Synchronize
Delphi-Quellcode:
bleiben. Probier es mal mit Letzterem und beachte zusätzlich, dass du wirklich nur die erforderlichen Codestellen synchronisierst. Auch hilfreich kann sein, die GUI Aktualisierung nicht nach jedem Rechenschritt auszuführen. Wenn du z.b. eh nur eine ProgressBar updatest, kannst du das ja ggfls. auch ohne Probleme nur alle 1000 Iterationen oder so durchführen, ohne dass man als Mensch davon etwas mitbekommt.
TThread.Queue
In Ordnung ist deine Methode vermutlich auch, bloß machst du es dir dadurch unnötig schwer und reduzierst zudem wahrscheinlich auch die Lesbarkeit deines Codes. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz