AGB  ·  Datenschutz  ·  Impressum  







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

Variabel viele Threads erstellen

Ein Thema von Ykcim · begonnen am 1. Jun 2024 · letzter Beitrag vom 4. Jun 2024
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#1

Variabel viele Threads erstellen

  Alt 1. Jun 2024, 22:18
Delphi-Version: 12 Athens
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 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
Patrick
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
124 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Variabel viele Threads erstellen

  Alt 1. Jun 2024, 22:42
Es fehlt ein:
SetLength(MywLeistungThreads, Length(RowsWeeks[0]));
und es muss heißen:
MywLeistungThreads[I] := TMyThread_Actually_wLeistung_MT.Create(true);
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Variabel viele Threads erstellen

  Alt 1. Jun 2024, 22:55
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
Patrick
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
244 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Variabel viele Threads erstellen

  Alt 2. Jun 2024, 08:07
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).
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Variabel viele Threads erstellen

  Alt 2. Jun 2024, 11:38
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...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Variabel viele Threads erstellen

  Alt 2. Jun 2024, 12:27
RowsWeeks und fRows_wLeistung sind irgendwelche Grifs, oder sonstwelche GUI-Komponenten?

Warum wird da ungesichert im Thread drauf zugegriffen?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Blup

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

AW: Variabel viele Threads erstellen

  Alt 3. Jun 2024, 17:30
Wenn auf fRows_wLeistung aus unterschiedlichen Threads zugegriffen wird, muss der Zugriff gegeneinander geschützt werden.
System.SyncObjs.TCriticalSection
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

AW: Variabel viele Threads erstellen

  Alt 3. Jun 2024, 18:14
Wenn es eine GUI-Komponente (z.B. Grid) ist, dann wird die CriticalSection nicht viel helfen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Blup

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

AW: Variabel viele Threads erstellen

  Alt 4. Jun 2024, 18:19
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.
  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 13:59 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