AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Hauptthread splitten und wieder zusammenführen
Thema durchsuchen
Ansicht
Themen-Optionen

Hauptthread splitten und wieder zusammenführen

Ein Thema von Patrick · begonnen am 1. Jul 2010 · letzter Beitrag vom 2. Jul 2010
Antwort Antwort
Seite 1 von 2  1 2      
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#1

Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 14:35
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.
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 14:47
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;
??
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 14:51
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?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 14:58
Ich würde einen extra thread machen, der alle anderen Threads verwaltet.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 15:01
Bliebe doch immer noch das Problem, dass der Hauptthread ungehindert weiter läuft?
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 15:02
soll er ja auch, oder?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 15:03
- 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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Jul 2010 um 15:06 Uhr)
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 15:19
@ 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.
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 15:22
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: Hauptthread splitten und wieder zusammenführen

  Alt 1. Jul 2010, 15:56
@PAtrick

Der Mainthread macht nur die Programmdarstellung mehr nicht.
Alle anderen Aufgaben werden von einem ControlThread erledigt, inkl. der Aufgaben danach.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:30 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