![]() |
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:
Die Zeile
{ 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;
Delphi-Quellcode:
löste den Fehler aus und der Meldung nach zu urteilen kann er den Thread nicht erstellen...
MywLeistungThreads[I].Create(true);
Kann mir jemand sagen, was der Fehler ist? Vielen Dank Patrick |
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);
|
AW: Variabel viele Threads erstellen
Hallo shebang,
vielen Dank für Deine schnelle und gute Antwort! Zitat:
Zitat:
Vielen Dank Patrick |
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). |
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:
Hier könnte aber auch eine simple parallel for Schleife reichen...
//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; |
AW: Variabel viele Threads erstellen
RowsWeeks und fRows_wLeistung sind irgendwelche Grifs, oder sonstwelche GUI-Komponenten?
Warum wird da ungesichert im Thread drauf zugegriffen? |
AW: Variabel viele Threads erstellen
Wenn auf fRows_wLeistung aus unterschiedlichen Threads zugegriffen wird, muss der Zugriff gegeneinander geschützt werden.
![]() |
AW: Variabel viele Threads erstellen
Wenn es eine GUI-Komponente (z.B. Grid) ist, dann wird die CriticalSection nicht viel helfen.
|
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