Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Von Thread auf Listview.Items.Data schreiben (https://www.delphipraxis.net/172032-von-thread-auf-listview-items-data-schreiben.html)

atc 9. Dez 2012 17:41

Delphi-Version: XE2

Von Thread auf Listview.Items.Data schreiben
 
Hallo,

ich weiß, dass man von einem Thread aus nicht auf VCL-Controls schreibend zugreifen darf.

Aber ein lesender Zugriff ist ok (auch wenn es mehrere Threads gleichzeitig machen)?
Beispiel:
Delphi-Quellcode:
procedure Thread;
var s:string;
begin
  s := form1.listview1.items[5].caption;
end;
Wie sieht es mit einem schreibenden Zugriff auf das Data Property einer Listview aus, wenn immer nur ein Thread gleichzeitig auf das Property zugreift. Ist das erlaubt?
Beispiel:
Delphi-Quellcode:
procedure Thread1;
begin
  PRec(form1.listview1.items[2].data)^.sName := 'test1';
end;

procedure Thread2;
begin
  PRec(form1.listview1.items[3].data)^.sName := 'test2';
end;
Ein kurzes Ja oder Nein als Antwort würde mir schon reichen, danke!

Sir Rufo 9. Dez 2012 17:53

AW: Von Thread auf Listview.Items.Data schreiben
 
Nein

atc 9. Dez 2012 17:58

AW: Von Thread auf Listview.Items.Data schreiben
 
OK, damit habe ich jetzt nicht gerechnet :o
Dann hätte ich doch bitte eine Begründung, warum man nicht auf Data zugreifen darf, es ist doch nur ein Zeiger und jedes Item hat seinen eigenen...

Bernhard Geyer 9. Dez 2012 19:24

AW: Von Thread auf Listview.Items.Data schreiben
 
Zitat:

Zitat von atc (Beitrag 1194869)
OK, damit habe ich jetzt nicht gerechnet :o
Dann hätte ich doch bitte eine Begründung, warum man nicht auf Data zugreifen darf, es ist doch nur ein Zeiger und jedes Item hat seinen eigenen...

Die Daten vom ListView werden größtenteils im Win32-Control gespeichert. Jedes lesen/schreiben erfolgt über entsprechende Windows-Messages. Und hier liegt das eigentliche Problem: Jedes Windows-Handle darf nur im erzeugenden Thread verwendet werden.

atc 9. Dez 2012 20:14

AW: Von Thread auf Listview.Items.Data schreiben
 
OK, danke für die Erklärung.

sx2008 9. Dez 2012 22:53

AW: Von Thread auf Listview.Items.Data schreiben
 
Erzeuge jeden Thread im Zustand "suspended".
Gib dann (im Hautpthread) jedem Threadobjekt alle Daten, die es für seine Arbeit braucht.
Delphi-Quellcode:
mythread := TMyThread.Create({suspended=}True);
mythread.Startpunkt := Point(0,0);
mythread.Endpunkt := Point(255,255);
mythread.xxxx := ...
...
mythread.Resume; // jetzt den Thread starten
Mit dieser simplen Technik bekommt der Thread alles was er braucht von Aussen mitgeteilt.
Anstatt dass der Thread aus den Daten des Hauptthreads liest (was Probleme macht)
bekommt er eine Kopie der Daten.

mjustin 10. Dez 2012 08:22

AW: Von Thread auf Listview.Items.Data schreiben
 
Zitat:

Zitat von sx2008 (Beitrag 1194885)
Erzeuge jeden Thread im Zustand "suspended".
Gib dann (im Hautpthread) jedem Threadobjekt alle Daten, die es für seine Arbeit braucht.

Oder verwende einen überladenen Konstruktor, dessen Parameter alles enthalten was der Thread verwenden soll.

Dann ist kein Suspended erforderlich, und keine Properties (die dazu verleiten könnten, sie auch später noch zu verwenden -> böser Fehler).


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 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