Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Parameter einem AnonymousThread übergeben. (https://www.delphipraxis.net/201330-parameter-einem-anonymousthread-uebergeben.html)

Kostas 12. Jul 2019 16:24

Delphi-Version: 10.2 Tokyo

Parameter einem AnonymousThread übergeben.
 
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

DieDolly 12. Jul 2019 16:28

AW: Parameter einem AnonymousThread übergeben.
 
Du kannst dir viel Arbeit ersparen, wenn du einfach einen ganz normalen TThread pro Log erzeugst.

Uwe Raabe 12. Jul 2019 16:50

AW: Parameter einem AnonymousThread übergeben.
 
Zitat:

Zitat von Kostas (Beitrag 1436629)
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;

Zacherl 13. Jul 2019 10:20

AW: Parameter einem AnonymousThread übergeben.
 
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.


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