Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TForm Controls an TThread übergeben (https://www.delphipraxis.net/155958-tform-controls-tthread-uebergeben.html)

youuu 15. Nov 2010 08:00

TForm Controls an TThread übergeben
 
Morgen,

also ich starte einen TThread aus einen Form z.B. Form1.

Nun möchte ich im Thread die Controls z.B. Memo und Edits im TThread nutzen, die zu dem Zeitpunkt ausgefüllt waren.

Nutze ich Sie direkt im Thread so:
Delphi-Quellcode:
s:= Form1.Edit1.Text;
erhalte ich eine Zugriffsverletzung.

Ja ich kann diese auch direkt übergeben, im Creator oder per extra Variable, aber ist es so wie in meinem Beispiel nicht möglich?

Bernhard Geyer 15. Nov 2010 08:03

AW: TForm Controls an TThread übergeben
 
Hast du den Hinweistext gesehen/durchgelesen der beim anlegen einer Unit mit TThread in der Unit vorhanden ist?

Es darf auf GUI-Controls nur im dem Thread zugegriffen werden in dem sie erzeugt wurden. Diese Einschränkung liegt daran begründet das alle Windows-Controls eine Thread-Affinität besitzten und nur im erzeugenden Thread gültig sind.

Du musst jeden Zugriff auf GUI-Controls mit Synchronize synchronisieren!

youuu 15. Nov 2010 08:24

AW: TForm Controls an TThread übergeben
 
Oh das wusste ich icht, ich dachte bei Ausgaben nur Synchronize benutzen zu müssen, aber auch bei einholen habe ich wohl nicht daran gedacht. Danke

Edit:

Delphi-Quellcode:
s:= Synchronize(frm_Email.MemoNachricht.Lines.Text)
funktioniert aber nicht. Falls du das meintest.

Bernhard Geyer 15. Nov 2010 08:29

AW: TForm Controls an TThread übergeben
 
Zitat:

Zitat von youuu (Beitrag 1061533)
Oh das wusste ich icht, ich dachte bei Ausgaben nur Synchronize benutzen zu müssen, aber auch bei einholen habe ich wohl nicht daran gedacht. Danke

Der Aufruf von TEdit.Text verursacht intern eine Windows-Message die den aktuellen Text des Controls abruft.
Wenn TEdit.Text nur eine Delphi/VCL-Internes property abfragen würde wäre das kein Problem.

Zitat:

Zitat von youuu (Beitrag 1061533)
Delphi-Quellcode:
s:= Synchronize(frm_Email.MemoNachricht.Lines.Text)
funktioniert aber nicht. Falls du das meintest.

Delphi-Quellcode:
procedure TMyThread.GetText;
begin
  FTheText:= Email.MemoNachricht.Lines.Text;
end;

procedure TMyThread.OtherFunction;
begin
...
  Synchronize(GetText);
  s := FTheText;
...

youuu 15. Nov 2010 08:31

AW: TForm Controls an TThread übergeben
 
Danke dir. Hab es verstanden.

sx2008 15. Nov 2010 10:36

AW: TForm Controls an TThread übergeben
 
Zitat:

Zitat von youuu (Beitrag 1061529)
Ja ich kann diese auch direkt übergeben, im Creator oder per extra Variable, aber ist es so wie in meinem Beispiel nicht möglich?

Das ist keine schlechte Idee.
Der Thread kann völlig sicher (und ohne ausgebremst zu werden) auf Informationen zu greifen, die ihm zu Beginn mitgegeben werden.
Ausserdem dient das der sauberen Entkopplung von Benutzeroberfläche und Threadlogik.

DeddyH 15. Nov 2010 10:48

AW: TForm Controls an TThread übergeben
 
Eben, und einem Thread kann man auch Properties und Events spendieren. Man muss nur darauf achten, dass man die Events dann in einer synchronisierten Methode feuert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.

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