Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Rückgabewert von Threads (https://www.delphipraxis.net/162833-rueckgabewert-von-threads.html)

Björn Ole 7. Sep 2011 14:28

AW: Rückgabewert von Threads
 
WaitForMultipleObjects passt hier nicht so ganz, da der Aufruf den Hauptthread und damit das Forumlar blockiert. Wie Uwe in #2 schon erwähnt hat, würde ich das auch mit dem OnTerminate Ereignis umsetzen.

Delphi-Quellcode:
procedure ButtonStartClick;
begin
  StartThreads;
end;

procedure StartThreads;
begin
  if ActiveThreads <> 0 then
    Exit; // falls noch Threads laufen, keine neuen starten
  ActiveThreads := 4; // Anzahl laufender Threads setzen
  for i := 1 to ActiveThreads do
    TMyThread.Create.OnTerminate := OnThreadTerminate; // Threads starten und Event setzen
end;

procedure OnThreadTerminate;
begin
  Dec(ActiveThreads); // Anzahl laufender Threads anpassen
  if ActiveThreads = 0 then // falls das der letzte von den 4 Threads war...
    StartThreads; // ...nächsten 4 Threads starten
end;

Wenn du dann noch FreeOnTerminate aller Threads auf true setzt, brauchst du dich auch nicht um die Freigabe der Threads zu kümmern.

patti 7. Sep 2011 14:42

AW: Rückgabewert von Threads
 
Zitat:

Zitat von Björn Ole (Beitrag 1122437)
Delphi-Quellcode:
procedure OnThreadTerminate;
begin
  Dec(ActiveThreads); // Anzahl laufender Threads anpassen
  if ActiveThreads = 0 then // falls das der letzte von den 4 Threads war...
    StartThreads; // ...nächsten 4 Threads starten
end;

So schaut das aber noch stark nach Race Condition aus. Problem ist, dass das Dekrementieren von ActiveThreads nicht atomar ist. Wenn jetzt mehrere Threads "gleichzeitig" fertig werden und "gleichzeitig" das Dekrementieren ausführen, kann es passieren, dass ActiveThreads nie 0 wird...

Hannes91 7. Sep 2011 14:45

AW: Rückgabewert von Threads
 
@Björn:
Wirklich ausgezeichnete Idee, den Start neuer Threads so zu lösen. :thumb:
Vielen Dank soweit!!

@patti:
Hast du einen Vorschlag, wie man das lösen könnte? Vielleicht ein Pendant zu Critical Sections?

Hannes

Björn Ole 7. Sep 2011 14:45

AW: Rückgabewert von Threads
 
Das OnTerminate Event der TThread Klasse wird im Kontext des Hauptthreads aufgerufen. Von daher stellt das kein Problem dar.

patti 7. Sep 2011 14:50

AW: Rückgabewert von Threads
 
Oh stimmt, hätte ich doch vorher mal in die Hilfe geschaut...

Zitat:

The OnTerminate event handler is called in the context of the main thread, which means methods and properties can be called freely.
Da hab ich wohl etwas zu schnell reagiert... :oops:

Björn Ole 7. Sep 2011 14:54

AW: Rückgabewert von Threads
 
[ot]Steht das wirklich so in der Hilfe? Ich hab nicht nachgeschaut, aber das ist ja eine 1zu1 Übersetzung. :shock:[/ot]

patti 7. Sep 2011 14:56

AW: Rückgabewert von Threads
 
Jupp, gerade mit Hilfe der Delphi-Referenz gefunden:

http://docs.embarcadero.com/products...Terminate.html ("Delphi 2010 Wiki")

Hannes91 7. Sep 2011 16:31

AW: Rückgabewert von Threads
 
So, an dieser Stelle möchte ich mich ganz herzlich bei euch für eure Mühe und Geduld, v.a. aber für euren Einfallsreichtum bedanken; ihr habt mir ein ganzen Stück weitergeholfen, sodass nun die Fertigstellung des besagten Programmes in greifbare Nähe rückt. Ein riesiges Dankeschön euch allen! :thumb:

Liebe Grüße

Hannes


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 Uhr.
Seite 2 von 2     12   

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