Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Tmemo und threads (https://www.delphipraxis.net/189536-tmemo-und-threads.html)

p80286 27. Jun 2016 13:19

AW: Tmemo und threads
 
Zitat:

Zitat von himitsu (Beitrag 1341234)
Du kannst also per SetWindowText an Edit.Handle von überall (anderer Thread oder gar andere Anwendung) etwas schicken und Windows synchronisiert das dann automatisch.

Ich hab mal versucht mich schlau zu machen, SetWindowText scheint aber nur innerhalb eines Threads zu funktionieren, das Mittel der Wahl wäre dann SendMessage(..WM_SETTEXT..).
(aber wo bleibt dann BeginUpdate/EndUpdate ?)


Gruß
K-H

himitsu 27. Jun 2016 13:25

AW: Tmemo und threads
 
Unnötig?
Der Text wird eh nur mit dem einem Befehl reingegeben und es gibt somit nur eine Aktualisierung.

OK, "synchronisiert" wird es nur "indirekt".
Windows fügt diese Message synchronisert in die MessageQueue des Erstellerthreads des Controls ein.
Und da nur der eine Thread seine Messages ausliest und verarbeitet, werden dort alle Messages auch immer nur nacheinander abgerifen/verarbeitet.

p80286 28. Jun 2016 15:21

AW: Tmemo und threads
 
Ich hab es mal umgesetzt, und es fluppt:
Delphi-Quellcode:
procedure TDirThread.Execute;
var
  ll : tstrings;
begin
  ll:=tstringlist.Create;
  Dirliste(Muster,tstrings(ll)); //liefert alle subdirs unterhalb von muster
  SendMessage(FMsgCompHandle, WM_SETTEXT, 0, Longint(PChar(ll.Text))); //FMsgCompHandle ist das Handle vom Memo1
  ll.Free;
end;
Vielen dank
K-H

himitsu 28. Jun 2016 17:55

AW: Tmemo und threads
 
Unter Win64 wird es mit LongInt natürlich knallen.
Selbst Integer/Cardinal ist inzwischen falsch, da dessen Größe eingefroren wurde.

Als Casts für Pointer solltest du immer nur die Typen IntPtr (falls das definiert ist), NativeInt NativeUInt (das neue "Integer") oder besser noch LPARAM, WPARAM und LRESULT verwenden.
Letztere sind die "eigentlichen" Typen der Parameter, für z.B. SendMessage, weswegen sie hier natürlich immer die richtigen Ergebnisse liefern.

NativeUInt/Cardinal statt NativeInt/Integer, da Pointer natürlich vorzeichenlos sind. :zwinker:

p80286 29. Jun 2016 10:54

AW: Tmemo und threads
 
Danke für den Hinweis, das kommt davon wenn man blöde abschreibt.
Delphi-Quellcode:
SendMessage(FMsgCompHandle, WM_SETTEXT, 0, LPARAM(PChar(ll.Text)));
(für mich ist Pchar noch in Ordnung!)

Aaber...

BS ist ein 64Bit-Windows. Kompiliert wurde das Programm mit D7 (also 32 Bit).
Hier verweist SendMessage auf SendMessageA (Ansi-Text?) und es gibt keine Unterscheidung zwischen 32 und 64 Bit. Warum sollte es auch knallen? Ich übergebe einen Wert (der unterhalb der 32Bit Grenze liegt) an eine 64Bit Speicherstelle. Das sollte passen. Etwas anders ist es wenn ich in einem 64Bit Kompilat einen 64Bit-Wert durch einen 32-Bit Typen "verhunze". Das kann gut gehen, aber man soll sich nicht wundern wenn es nicht gut geht.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz