Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Variabel viele Threads erstellen (https://www.delphipraxis.net/215243-variabel-viele-threads-erstellen.html)

Ykcim 1. Jun 2024 21:18

Delphi-Version: 12 Athens

Variabel viele Threads erstellen
 
Hallo Zusammen,

ich mit Threads leider noch nicht sicher, daher habe ich eine Frage zur Rückgabe von Ergebnissen.

Ich möchte Abfragen in mehreren Threads ausführen.

Da ich nicht weiß, wieviele Threads benötigt werden, möchte ich diese zur Laufzeit erstellen. Ich habe es wie folgt versucht, aber leider gibt es einen Fehler, wenn ich die Threads erstellen möchte...

Delphi-Quellcode:
{ TMyThread_Actually_wLeistung_Main }

procedure TMyThread_Actually_wLeistung_Main.Execute;
var  Logic: TLogic;
      RowsWeeks: TRows;
      I: integer;
      MywLeistungThreads: Array of TMyThread_Actually_wLeistung_MT;
      ThreadsCompleted: boolean;
begin
   inherited;
   Logic:= TLogic.Create;
   fWriteSingleResults:= WriteRowsResult;
   Try
      //KWs und Daten zu KWs errechnen
      RowsWeeks:= Logic.GetWeekDates(fVonDate, fBisDate);
      //Threads erstellen
      for I := 0 to Length(RowsWeeks[0]) -1 do begin        
         MywLeistungThreads[I].Create(true);
         MywLeistungThreads[I].fMaschinenId:= fMaschinenId;
         MywLeistungThreads[I].SG_Name:= fSG_Name;
         MywLeistungThreads[I].MaschinenId := fMaschinenId;
         MywLeistungThreads[I].VonDate := StrToDate(RowsWeeks[1,I]);
         MywLeistungThreads[I].BisDate := StrToDate(RowsWeeks[2,I]);
         MywLeistungThreads[I].WritewLeistungSingleRows := fWriteSingleResults;
         MywLeistungThreads[I].Resume;
      end;
      //Auf Ergebnisse warten
      {MsgWaitForMultipleObjects(   }
      ThreadsCompleted:= false;
      while ThreadsCompleted = false do begin
         ThreadsCompleted:= true;
         for I := 0 to Length(fRows_wLeistung[0]) -1 do begin
            if fRows_wLeistung[1,I] = '' then begin
               ThreadsCompleted:= false;
            end;
         end;
         Sleep(500);
      end;
      Synchronize(procedure
                  begin
                     if Assigned(fWritewLeistung_Press) then begin
                        fWritewLeistung_Press(fSG_Name, fMaschinenID, fCols_wLeistung, fRows_wLeistung);
                     end;
                  end);
   Finally
      Logic.Free;
  End;
end;
Die Zeile
Delphi-Quellcode:
MywLeistungThreads[I].Create(true);
löste den Fehler aus und der Meldung nach zu urteilen kann er den Thread nicht erstellen...
Kann mir jemand sagen, was der Fehler ist?

Vielen Dank
Patrick

shebang 1. Jun 2024 21:42

AW: Variabel viele Threads erstellen
 
Es fehlt ein:
Delphi-Quellcode:
SetLength(MywLeistungThreads, Length(RowsWeeks[0]));

und es muss heißen:
Delphi-Quellcode:
MywLeistungThreads[I] := TMyThread_Actually_wLeistung_MT.Create(true);

Ykcim 1. Jun 2024 21:55

AW: Variabel viele Threads erstellen
 
Hallo shebang,

vielen Dank für Deine schnelle und gute Antwort!

Zitat:

SetLength(MywLeistungThreads, Length(RowsWeeks[0]));
Das war mir auch gerade aufgefallen, aber danach

Zitat:

MywLeistungThreads[I] := TMyThread_Actually_wLeistung_MT.Create(true);
hätte ich noch sehr lange gesucht!

Vielen Dank
Patrick

TomyN 2. Jun 2024 07:07

AW: Variabel viele Threads erstellen
 
Hi
- Ich würde noch FreeOnTerminate bei den Threads setzen (und sie dann entsprechend beenden)
- Zum Starten eines Threads einfach start verwenden. Resume war dazu gedacht, einen von extern angehaltenen Thread wieder von extern zum laufen zu bringen (was fast immer keine gute Idee ist, daher inzwischen Deprecated).

jaenicke 2. Jun 2024 10:38

AW: Variabel viele Threads erstellen
 
Ich würde dem Thread einfach einen eigenen Konstruktor spendieren, der einen Record mit den Daten übergeben bekommt. Dann brauchst du in der Schleife auch nicht alles neu setzen...
Delphi-Quellcode:
      //KWs und Daten zu KWs errechnen
      RowsWeeks := Logic.GetWeekDates(fVonDate, fBisDate);
      //Threads erstellen
      RowData.fMaschinenId := fMaschinenId;
      RowData.SG_Name := fSG_Name;
      RowData.MaschinenId := fMaschinenId;
      RowData.WritewLeistungSingleRows := fWriteSingleResults;
      for I := 0 to Length(RowsWeeks[0]) -1 do
      begin
        RowData.VonDate := StrToDate(RowsWeeks[1, I]);
        RowData.BisDate := StrToDate(RowsWeeks[2, I]);
        MywLeistungThreads[I] := TMyThread_Actually_wLeistung_MT.Create(RowData); // im inherited des Konstruktors dann false, damit er gleich losrennt
      end;
Hier könnte aber auch eine simple parallel for Schleife reichen...

himitsu 2. Jun 2024 11:27

AW: Variabel viele Threads erstellen
 
RowsWeeks und fRows_wLeistung sind irgendwelche Grifs, oder sonstwelche GUI-Komponenten?

Warum wird da ungesichert im Thread drauf zugegriffen?

Blup 3. Jun 2024 16:30

AW: Variabel viele Threads erstellen
 
Wenn auf fRows_wLeistung aus unterschiedlichen Threads zugegriffen wird, muss der Zugriff gegeneinander geschützt werden.
System.SyncObjs.TCriticalSection

himitsu 3. Jun 2024 17:14

AW: Variabel viele Threads erstellen
 
Wenn es eine GUI-Komponente (z.B. Grid) ist, dann wird die CriticalSection nicht viel helfen.

Blup 4. Jun 2024 17:19

AW: Variabel viele Threads erstellen
 
So wie fRows_wLeistung verwendet wird, ist es vermutlich als Array in TMyThread_Actually_wLeistung_Main deklariert.
Wahrscheinlich wird das Ergebnis dort mit WriteRowsResult() durch die einzelnen SubThreads TMyThread_Actually_wLeistung_MT abgelegt.


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