Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Hauptthread splitten und wieder zusammenführen (https://www.delphipraxis.net/152675-hauptthread-splitten-und-wieder-zusammenfuehren.html)

Patrick 1. Jul 2010 14:35

Hauptthread splitten und wieder zusammenführen
 
Hallo,

Ich möchte eine Funktion parallelisieren. Der Code der die Funktion aufruft ist wurscht. Den Code meiner Funktion kann ich spielend parallelisieren. Aber der Code (Aufrufstack), der nach dem Aufruf meiner Funktion bearbeitet wird, ist der Knackpunkt. Ich weis nicht, was danach passiert. Die Funktion wird an X unterschiedlichen Stellen aufgerufen. Erstelle ich einfach nur Subthreads, die meine Aufgabe erfüllen, läuft der Hauptthread weiter und will Ergebnisse ausspucken, die noch gar nicht berechnet wurden. Er solle aber warten, bis meine Subthreads zu ende gerechnet haben. Den Hauptthread kann ich aber nicht so einfach pausieren, da sonst das Programm hängt und die Subthreads keine Synchonizes mehr machen können. Bleiben zwei Möglichkeiten: Ich sage dem Haupttherad er soll an der aktuellen Position Pausieren, aber trotzdem ProcessMessages abarbeiten. Oder ich merke mir irgendwie den Aufrufstack und unterbreche ihn an dieser Stelle.

Code:
     +-----+
     +-----+
-----+?????+-------
|    |      |
|    |      Code nach Funktionsaufruf
|    Funktionsaufruf
Code vor Funktionsaufruf
Sinn des ganzen ist es einfach für die spezielle Funktion alle CPU-Kerne zur Berechnung zu bemühen.

Bummi 1. Jul 2010 14:47

AW: Hauptthread splitten und wieder zusammenführen
 
Einen Counter beim Aufruf hochzählen lassen und OnTerminate dekrementiern und im Programm vor der Weiterverabeitung
While Threadcount>0 do
begin
Application.ProcessMessages;
Sleep(50);
end;
??

Patrick 1. Jul 2010 14:51

AW: Hauptthread splitten und wieder zusammenführen
 
Ja, so was habe ich mir auch schon überlegt, aber ich habe mich gefragt ob es da nicht was eleganteres gibt. Geht das nicht ohne Polling?

sirius 1. Jul 2010 14:58

AW: Hauptthread splitten und wieder zusammenführen
 
Ich würde einen extra thread machen, der alle anderen Threads verwaltet.

Patrick 1. Jul 2010 15:01

AW: Hauptthread splitten und wieder zusammenführen
 
Bliebe doch immer noch das Problem, dass der Hauptthread ungehindert weiter läuft?

sirius 1. Jul 2010 15:02

AW: Hauptthread splitten und wieder zusammenführen
 
soll er ja auch, oder?

himitsu 1. Jul 2010 15:03

AW: Hauptthread splitten und wieder zusammenführen
 
- alle Sub-Threads starten
- warten bis alle Threads beendet sind
- Ergebnisse ausgeben


wie du jetzt wartest ist egal ... da gibt's ja viele Wege
(der Thread bietes z.B. WaitFor)

wenn der Hauptthread auch mal nicht reagieren muß (ala Application.ProcessMessages) die WaitFors aller Thread nacheinander aufrufen (die Reihenfolge ist egal) und wenn man damit durch ist, dann sind alle SubThreads fertig.


PS: es geht auch so
- alle SubThreads starten (je einen Teil abarbeiten lassen)
- der Hautthread kann auch was machen und einen Teil abarbeiten
- warten bis alle Threads beendet sind
- Ergebnisse ausgeben

Patrick 1. Jul 2010 15:19

AW: Hauptthread splitten und wieder zusammenführen
 
@ sirius
Jain. Er darf den Code (Aufrufstack) nach meiner Funktion erst abarbeiten, wenn alle Threads fertig sind. Aber ProcessMessages (Synchronizes, usw...) soll er noch annehmen.

@himitsu
Mit WaitFor blockiere ich doch den Thread, der die Funktion aufruft, ergo den Hauptthread. Ist doch ne Semaphore, oder? Ne Semaphore lässt sich an der Stelle leider nicht verwenden, weil dann auch keine ProcessMessages mehr abgearbeitet werden.

Bummi 1. Jul 2010 15:22

AW: Hauptthread splitten und wieder zusammenführen
 
oder die Aufgabe zerlegen in:

Prepare
lockbi1=1
starte alle Threads
lockbit=0
erstmal fertig

und im OnTerminate:
if lockbit=0 and Threadcount=0 then
2 er Teil Deiner Berechnung

sirius 1. Jul 2010 15:56

AW: Hauptthread splitten und wieder zusammenführen
 
@PAtrick

Der Mainthread macht nur die Programmdarstellung mehr nicht.
Alle anderen Aufgaben werden von einem ControlThread erledigt, inkl. der Aufgaben danach.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 Uhr.
Seite 1 von 2  1 2      

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