AGB  ·  Datenschutz  ·  Impressum  







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

Parameter einem AnonymousThread übergeben.

Ein Thema von Kostas · begonnen am 12. Jul 2019 · letzter Beitrag vom 13. Jul 2019
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Parameter einem AnonymousThread übergeben.

  Alt 12. Jul 2019, 17:24
Delphi-Version: 10.2 Tokyo
Hallo Zusammen,

ich teste gerade eine Methode die ThreadSave Logfiles erzeugt.
Zum testen lasse ich 500 AnonymousThread laufen die in die selbe Datei schreiben.
Das funktioniert auch einwandfrei. Jetzt wollte ich in der Datei den Zähler 0..500 hineinschreiben.

Es werden genau 500 Zeilen geschrieben. Mir ist klar, die Threads werden sofort gestartet und das OS entscheidet wann genau ein Thread Startet.
Wenn mann sich das Ergebnis unten anschaut, ist zu sehen, der erste Thread der in das File schreibt, ist schon bei i=3 es wurde also schon mindestens vier Threads erzeugt. Der nächste Thread ist schon bei i=23. Nebenbei bemerkt noch: Es sind mehrere Einträge mit den gleichen i Wert von unterschiedlichen Treads. Die Zahl nach dem Zeitstempel ist die ThreadID und dann kommt der Zähler. Warum der Zähler so ist ist schon klar. Die Threads können erst auf die Variable i zugreifen wenn sie vom OS gestartet werden. In der Zeit wurden weitere Threads erzeugt.

Ich brauche das jetzt nicht wirklich, dennoch würde mich interessieren wie man dem Thread über Parameter den aktuellen Wert der Zählvariable i übergeben kann?

Gruß Kostas

Delphi-Quellcode:
  for i := 0 to 500 do
  begin
    TThread.CreateAnonymousThread(
      procedure
      var FileName:String;

      begin
        FileName := ChangeFileExt(Application.ExeName,'.log');
        FThreadFileLog.Log(IntToStr(i));
      end
    ).Start;
  end;

12.07.2019 17:05:50.387 00007412 3
12.07.2019 17:05:50.428 00008640 23
12.07.2019 17:05:50.461 00006440 28
12.07.2019 17:05:50.514 00007872 32
12.07.2019 17:05:50.529 00002004 32
12.07.2019 17:05:50.584 00008984 40
12.07.2019 17:05:50.598 00002176 40
12.07.2019 17:05:50.630 00001412 41
12.07.2019 17:05:50.666 00007772 41
12.07.2019 17:05:50.698 00000236 41
12.07.2019 17:05:50.730 00007080 41
12.07.2019 17:05:50.762 00001080 41
12.07.2019 17:05:50.795 00003192 47
12.07.2019 17:05:50.827 00005412 48
12.07.2019 17:05:50.880 00007472 56
12.07.2019 17:05:50.894 00009120 56
12.07.2019 17:05:50.925 00001996 56
12.07.2019 17:05:50.957 00004616 56
12.07.2019 17:05:50.989 00004472 56
12.07.2019 17:05:51.021 00008248 56
12.07.2019 17:05:51.052 00005932 57
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: Parameter einem AnonymousThread übergeben.

  Alt 12. Jul 2019, 17:28
Du kannst dir viel Arbeit ersparen, wenn du einfach einen ganz normalen TThread pro Log erzeugst.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#3

AW: Parameter einem AnonymousThread übergeben.

  Alt 12. Jul 2019, 17:50
dennoch würde mich interessieren wie man dem Thread über Parameter den aktuellen Wert der Zählvariable i übergeben kann?
Mach dir eine Funktion mit Rückgabe der ThreadProc und I als Parameter:
Delphi-Quellcode:
function <Klasse>.MakeThreadProc(I: Integer): TProc;
begin
  result :=
    procedure
    var
      FileName: String;
    begin
      FileName := ChangeFileExt(Application.ExeName, '.log');
      FThreadFileLog.Log(IntToStr(i));
    end;
end;

...

var
  i: Integer;
begin
  for i := 0 to 500 do
  begin
    TThread.CreateAnonymousThread(MakeThreadProc(I)).Start;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Parameter einem AnonymousThread übergeben.

  Alt 13. Jul 2019, 11:20
Zur Erklärung: Du sorgst mit der extra Methode dafür, dass eine Kopie des Parameters erzeugt wird, mit der dein Thread letztendlich arbeitet. Erstellst du die Threads wie zuvor einfach so in einer Schleife, dann zeigen alle Referenzen auf die selbe Variable im Speicher.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:40 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