AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parameter an Thread übergeben

Ein Thema von IMPEGA · begonnen am 8. Sep 2013 · letzter Beitrag vom 2. Okt 2013
Antwort Antwort
Seite 1 von 2  1 2      
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Parameter an Thread übergeben

  Alt 8. Sep 2013, 12:16
Eine wichtige Frage habe ich noch bevor es weiter gehen kann.

Zitat:
Und "Uses unit1" hat in der ThreadUnit nichts verloren.
Nun, wie gebe ich die Werte wieder zurück ?
In meinem Fall ist es eine
- Stringlist, die im Thread bearbeitet und zurück gegeben werden soll.
- Ein String, der in eine ListBox einzufügen ist
- Ein Integer der sich immer ändert. Sprich ist starte mehrere Threads (ohne Event) einfach
Delphi-Quellcode:
  for i := 1 to 1 do
    begin
      Thread[i] := TMyThread.Create(True);
      Thread[i].Liste := Liste;
      Thread[i].FreeOnTerminate := True;
      Thread[i].Resume;
    end;
Nun, wird etwas im Thread gemacht und mein Progressbar muss aktualisiert werden.
Wie gibt man so was zurück ohne
uses Unit1 im Thread ?

Etwa über property , aber in andere Richtung? --> wohl kaum.

Geändert von IMPEGA ( 8. Sep 2013 um 12:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.022 Beiträge
 
Delphi 12 Athens
 
#2

AW: Parameter an Thread übergeben

  Alt 8. Sep 2013, 13:22
FreeOnTerminate und Resume ist keine gute Idee, da der Thread dann evtl. so schnell weg ist, dass es Zugriffsprobleme gibt.
Und einen Thread, der auf FreeOnTerminate gesetzt ist, in einer Liste zu speichern ist ein No-Go, denn du weißt nie, wann du noch darauf zugreifen kannst.

Du musst dich entscheiden:
Möchtest du von außen deine TThread-Objekte in einer Liste haben, dann musst du diese auch von außen am Ende freigeben. Oder du benutzt FreeOnTerminate, überlässt die Threads dann aber auch sich selbst.

Zudem ist es auch viel einfacher, wenn du deine Liste gleich im Konstruktor übergibst. Zur Aktualisierung der Progressbar gibt es mehrere Möglichkeiten, eine ist mit Snychronize zu arbeiten, aber das bremst den Thread aus. Alternativ schick einfach mit PostMessage eine Message an das Hauptfenster, dann macht Windows die Synchronisation für dich.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Parameter an Thread übergeben

  Alt 8. Sep 2013, 13:57
Zitat:
Zudem ist es auch viel einfacher, wenn du deine Liste gleich im Konstruktor übergibst.
So weit bin ich noch nicht. Wie schon gesagt Step by Step.

Zitat:
Alternativ schick einfach mit PostMessage eine Message an das Hauptfenster, dann macht Windows die Synchronisation für dich.
Damit komme ich ohne Beispiel nicht klar. Wäre aber interessante Sache.

Bis jetzt Alles was ich gelesen habe arbeitete mit Synchronize. Ob es nun etwas langsamer ist , ist für mich nicht wirklich wichtig, ich versuche halt nach und nach die Sache zu verstehen. Allerdings bei Synchronize kann man kaum auf Uses UNIT1 verzichten.
Ganz so einfach ist das doch nicht. Leider. Ich versuche wie gesagt nach und nach etwas mehr zu verstehen.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Parameter an Thread übergeben

  Alt 8. Sep 2013, 14:25
Etwa über property , aber in andere Richtung? --> wohl kaum.
Eben, dann bekommst du eine Zirkularität rein, auch wenn der Compiler das unterhalb von implementation akzeptieren würde.

Kleines ThreadBeispiel mit Events:
Angehängte Dateien
Dateityp: zip SimplePrime.zip (2,5 KB, 58x aufgerufen)
  Mit Zitat antworten Zitat
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Parameter an Thread übergeben

  Alt 8. Sep 2013, 14:44
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.

Geändert von IMPEGA ( 9. Sep 2013 um 11:58 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#6

AW: Parameter an Thread übergeben

  Alt 2. Okt 2013, 07:56
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#7

AW: Parameter an Thread übergeben

  Alt 2. Okt 2013, 08:31
Und wenn Du einen Pointer auf den Record an den Thread übergibst und innerhalb des Threads auf diesen zugreifst?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#8

AW: Parameter an Thread übergeben

  Alt 2. Okt 2013, 08:52
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.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.490 Beiträge
 
Delphi 12 Athens
 
#9

AW: Parameter an Thread übergeben

  Alt 2. Okt 2013, 08:59
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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#10

AW: Parameter an Thread übergeben

  Alt 2. Okt 2013, 09:04
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 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