Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thread) (https://www.delphipraxis.net/192395-frage-zu-threads-objectlist-mit-klassen-jede-klasse-hat-variablen-ggf-1-thread.html)

a.def 14. Apr 2017 20:38

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
Zitat:

Wenn ich dich richtig verstanden habe, (...)
Hast du. Da ich exakt eine Variable pro Klasseninstanz aber in 2 Unterklassen brauche, habe ich aktuell pro Unterklasse eben diese Variable 1x.

Zitat:

(also eine Referenz auf dein jeweiliges TThreads)
Wenn man das machen darf, hört sich das gut an!

Ehrlich gesagt habe ich da jetzt nur spontan Pointer und Const im Kopf. Aber das ist es nicht, was du ansprichst, oder?

Woran ich auch gedacht habe ist, dem Thread eine ID mitzugeben (die ID des "items[i]"). Aber das würde mich sehr einschränken was Änderungen an den ObjectList-Items, also den Klasseninstanzen, angeht.

BrightAngel 14. Apr 2017 20:45

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
Du kannst deinem Thread übergeben was dir beliebt. Es ist ja dein Programm 8-)
Oder dein TMeinThread hat eben entsprechende (u.U. private) Felder, die im Construktor mit übergeben werden, auf die du dann von Execute aus Zugriff hast.
Wenn die Variablen auch nur dort relevant sind, kannst du diese vielleicht auch aus TThreads dorthin verschieben und dann auch von dort darauf zugreifen?

Vermute ich das richtig, dass deine Referenz itemX auf deinen Thread in TThreads nur deshalb existiert, damit du diesen noch von außen abbrechen kannst/den Status rausfinden kannst? Existieren TThreads Einträge in deiner Liste, deren itemX nil ist?

Brighty

a.def 14. Apr 2017 20:49

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
itemX ist die Instanzvariable des Threads und mit aThreadInfo.ThreadList.Items[i].itemX.bPause lege ich den Thread schlafen (ich prüfe einfach auf while bPause do ... (bPause, property, Boolean steht in der Unit des Threads)

Habe gerade das hier gefunden und gucke es mir gleich mal an.
http://stackoverflow.com/questions/3...-pass-by-value

Demnach kann ich dann ja ... ok muss ich gleich gucken wenn ich wieder eine IDE habe.. gucke ich gleich welches Object ich als Parameter übergeben kann.


Edit.

wenn ich den constructor habe

Delphi-Quellcode:
constructor TThreads.Create(...);
begin
...
 itemX := TMeinThread.Create(...); // <== HIER
...
end;


aThreadInfo.ThreadList.Add(TThread.Create(...));
Da müsste ich dann ja die Referenz übergeben. Wäre das hier, haut mich nicht.. aber wäre das nicht "Self" (constructor)?

BrightAngel 14. Apr 2017 21:05

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
Ah. Ich wusste unser Problem liegt wo anders :thumb:
Ja, also wenn du ganz klassisch (so wie bei einem ganz normalen Funktionsaufruf, in Konstruktoren, ...) ein Objekt mit übergibst, dann ist das nur eine Referenz auf dieses Objekt. Intern übersetzt dir dein Compiler das oft einfach nur in Pointer auf das Objekt. Also genau wie indem stackoverflow Beitrag beschrieben... Dich hindert niemand daran, diese Referenz in mehreren Instanzen oder/und in mehreren Feldern zu halten. Nur aufpassen beim Free usw: Wenn du natürlich das Free auf einer dieser Referenzen aufrufst, dann werden die anderen logischerweise auch davon betroffen sein!

Brighty

Edit: genau. TMeinThread.Create braucht halt im Konstruktor noch entsprechend den Parameter. Was du hier aber jetzt machst ist das klassische Beispiel einer zirkulären Referenz: dein TMeinThread kennt TThreads und TThreads kennt TMeinThread. Wenn du das auflösen willst, sag bescheid; da gibt es einen kleinen Trick.

a.def 14. Apr 2017 21:10

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
Ok nur um das festzuhalten:
"Self" im Konstruktor bezieht sich auf den Konstruktor/das durch den Konstruktor erzeugte Objekt selber.

Und im Konstruktor itemX := TMeinThread.Create(...); aufrufen würde mir in der Thread-Instanz ItemX dann eine Referenz auf das TThread zur Verfügung stellen?

BrightAngel 14. Apr 2017 21:11

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
TThreads; Nicht nur im Konstruktor. Innerhalb einer Methode, Funktion, Destruktor, ...

a.def 14. Apr 2017 21:13

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
Ich teste das gleich mal schnell. Sollte ja nur eine Tipparbeit von 1 Minute sein (neuer Parameter) und ein showmessage in der Thread-Unit zum Test.

BrightAngel 14. Apr 2017 21:20

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
Die spannende Frage verbleibt: Wenn deine TThreadInfo.ThreadList nur diejenigen Einträge deiner ListView Einträge hält, die grade einen Thread benötigen; Brauchst du dann TThreads als Klasse wirklich? Oder könntest du nicht dann auch den Typ deiner ThreadList einfach auf TMeinThread ändern und einfach alle itemY, itemZ, itemQ, itemA,.... Felder in deine TMeinThread Klasse verschrieben und TThreads wegrationalisieren?
(Kenne den Rest des Programms nicht...)

TMeinThread ist schließlich auch nur eine ganz stinknormale Klasse, die einfach nur von TThread erbt. Nichts besonderes also; die kann ganz normal Methoden und Felder bekommen, wenn sie mag... :)

Brighty

a.def 14. Apr 2017 21:25

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
Demnach könnte ich dann mein Konstrukt
Delphi-Quellcode:
type
 TThreadInfo = packed record
  ThreadList: TObjectList<TThreads>;
  iThreadID: Cardinal;
  ThreadHandle: THandle;
 end;
entfernen. Die Variablen iThreadID und ThreadHandle benutze ich so oder so nirgendwo.

Oder habe ich etwas falsch verstanden?

BrightAngel 14. Apr 2017 21:27

AW: Frage zu Threads (ObjectList mit Klassen, jede Klasse hat Variablen + ggf. 1 Thre
 
... und aus

Delphi-Quellcode:
ThreadList: TObjectList<TThreads>;
würde

Delphi-Quellcode:
ThreadList: TObjectList<TMeinThread>;
, wenn du alle anderen Felder außer itemX nach TMeinThread verschieben würdest (itemX fiele ganz weg in dem Fall).

Wenn du soweit bist und damit zufrieden bist, könnten wir eventuell nochwas anderes ansprechen, wenn du magst :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:57 Uhr.
Seite 2 von 5     12 34     Letzte »    

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