![]() |
AW: Parameter an Thread übergeben
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Kleines ThreadBeispiel mit Events: |
AW: Parameter an Thread übergeben
Danke dir. Das muss ich zuerst durch kauen.
Es bringt mich aber schon weiter. EDIT: OK, soweit habe ich es verstanden. Hier passiert nämlich folgendes, wir starten ein Thread erhalten die Information, tragen die in die memo1 ein. So lange bis wir es terminieren oder ThreadActivate := false; Nun, gut und schön, ich möchte aber die Möglichkeit haben die Anzahl der Threads zu bestimmen. Und zwar so dass zB. Meine Liste 10 Einheiten hat, ich die mit 5 Threads abarbeiten möchte. In Forum habe ich schon etwas gefunden, Threadpool wäre interessant. Es ist aber noch etwas zu schwer für mich. @Bjoerk Dein Beispiel kann ich sehr gut verstehen, kann man das auch so irgendwie realisieren dass man mehrere Threads startet? Ich meine so dass der nächste Thread immer den Nächsten Job übernimmt und nicht so dass man mehrere Threads parallel startet die das Gleiche tun. Das was ich hier in Forum gefunden habe übersteigt meine Möglichkeiten.(Leider) Ich versuche es zwar Alles zu verstehen, ganz so einfach ist es aber nicht. |
AW: Parameter an Thread übergeben
Bezueglich dieses Themas habe ich noch eine weitere Frage:
Ich habe eine Variable folgenden Typs, die im Hauptprogramm global definiert ist: type TMyVar = record a : String; b : String; c : Array of Array of integer; d : Integer; e : Array[1..6,1..6] of double; end; var MyVar : TMyVar; Weder das Uebergeben des Wertes mittels einer Threadprozedur folgender Form procedure MyThread.setMyVar(var MV : TMyVar); begin FMyVar := MV; end; (also via MyThread.setMyVar(MyVar);) noch die Uebergabe mittels 'property ...' bewirken, dass Aenderungen die der Thread an dem Record durchfuehrt (d.h., an FMyVar) , nach Beendigung des Threads auch and der Originalvariablen MyVar geschehen sind. Wie kann ich es erreichen dass die vom Thread gemachten Aenderungen am Record auch in MyVar geschehen? Gruesse Gutelo |
AW: Parameter an Thread übergeben
Und wenn Du einen Pointer auf den Record an den Thread übergibst und innerhalb des Threads auf diesen zugreifst?
|
AW: Parameter an Thread übergeben
Ich habe gerade nochmal den Informationsfluss von Mainform zu Thread ueberprueft. Der Inhalt des Records im Mainform kommt definitv im Thread an. Kann es sein dass Uebergaben bei Threads nicht per call-by-reference geschehen? Dann wunder ich mich aber, dass bei uebergebenen VCL Komponenten ein synchronize moeglich ist.
|
AW: Parameter an Thread übergeben
Objekte, also auch VCL-Komponenten, werden immer als Referenz übergeben und in Referenzvariablen gespeichert.
Deine interne Record-Variable ist aber keine Referenz, sondern eine Kopie.
Delphi-Quellcode:
type
PMyVar = ^TMyVar; TMyThread = class(TThread) private FExtVar: PMyVar; FMyVar: TMyVar; CopyToExtVar; DoOnTerminate; override; public {darf nur im constructor oder vor dem Resume aus dem Hauptthread aufgerufen werden} InitMyVar(var MV: TMyVar); end; procedure TMyThread.InitMyVar(var MV: TMyVar); begin {Verweis auf externe Variable} FExtVar := @MV; {Kopie der externen Variable} FMyVar := MV; end; procedure TMyThread.DoOnTerminate; begin {wird beim Beenden im Thread aufgerufen} if Assigned(FExtVar) then Synchronize(CopyToExtVar); inherited; end; procedure TMyThread.CopyToExtVar; begin {interne Variable in die externe Variable kopieren} if Assigned(FExtVar) then FExtVar^ := FMyVar; end; |
AW: Parameter an Thread übergeben
IIRC wird durch die Zuweisung des Parameters an das private Feld eine Kopie des Records erzeugt, da nützt auch die "var"-Angabe nichts. Übergibt man hingegen den Pointer, arbeitet man tatsächlich mit dem Original. Objektinstanzen sind übrigens intern auch Pointer, daher funktioniert das damit.
|
AW: Parameter an Thread übergeben
hmm genau das scheint der Fall zu sein. Records werden anscheinend nur call-by-value an Threads uebergeben. Siehe folgende Diskussion:
![]() Der letzte Vorschlag in der Liste entspricht der Idee von DeddyH einen Pointer auf das Array zu uebergeben. Ganz wohl ist mir dabei nicht, da ich nicht sicher bin ob das Terminieren des Threads ein moegliches Problem darstellen koennte. |
AW: Parameter an Thread übergeben
Solange Du nicht auf die Idee kommst, beim Terminieren des Threads ein Dispose auf den Pointer loszulassen, wüsste ich nicht, was für Probleme auftreten sollten.
|
AW: Parameter an Thread übergeben
Zitat:
Objektvariablen sind Pointer die auf eine Instanz der Klasse (oder einer abegleiteten Klasse) verweisen. Bei der Zuweisung einer Objektvariablen wird nicht die Instanz kopiert, sondern nur deren Adresse weitergegeben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 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