AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TParallel.for innerhalb iTask

TParallel.for innerhalb iTask

Ein Thema von ich2 · begonnen am 12. Aug 2019 · letzter Beitrag vom 13. Aug 2019
Antwort Antwort
Benutzerbild von ich2
ich2

Registriert seit: 7. Dez 2005
Ort: Würzburg
45 Beiträge
 
#1

TParallel.for innerhalb iTask

  Alt 12. Aug 2019, 22:44
Hallo zusammen,

mir ist da etwas merkwürdiges aufgefallen und da wollte ich mal in die Runde fragen...

Hintergrund ist folgender: per Webcam wird ein Videostream verarbeitet, wobei dabei mehrere Filter und so weiter über die Einzelbilder geschmissen werden. Damit das ganze flott läuft sind die Filter oftmals mit TParallel.for Schleifen versehen.
Parallel zu der Bildverarbeitung läuft noch ein Scripting-Tool, welches u.a. auf externe Geräte zugreift.
Damit es nicht zu unnötigen Kollisionen und ruckeliger GUI kommt, wird das Script innerhalb einer Task abgearbeitet.
Über das Script nun werden dann auch Funktionen für die Datenauswertung verwendet, welche wiederum mit TParallel.For Schleifen beschleunigt werden.

Das ganze läuft soweit eigentlich ganz gut...aber nach einiger Zeit wird das ganze System immer träger und schließlich dauern die Bearbeitungsschritte immer länger...ein Blick in den Process Explorer zeigt, dass es nicht am Speicher liegt, sondern an der immer weiter wachsenden Anzahl an Threads, welche zu dem Programm gehören.

Also dann mal schnell ein Test (siehe unten) aufgesetzt und tatsächlich:
wenn zu schnell versucht wird, die Tasks aufzurufen bevor die Arbeit gemacht ist, dann kommen immer mehr Threads dazu...

Jetzt die Frage...was kann man dagegen tun?

besten Dank
Angehängte Dateien
Dateityp: rar TParallel_TTask_issue.rar (52,7 KB, 6x aufgerufen)
Wissen ist Macht. Das ändert aber so gut wie nichts an der Übermacht der Dummheit.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.508 Beiträge
 
#2

AW: TParallel.for innerhalb iTask

  Alt 13. Aug 2019, 07:38
Es gibt da so ein Sprichwort: Wenn du versuchst, ein Problem mit Thread zu lösen, hast du danach zwei Probleme.

Zu deinen Problemen: Wenn du eine geringfügig höhere Latenz verkraft kannst, würde ich die Bildverarbeitung single-threaded machen. Du bekommst ohnehin alle 16ms ein neues Bild, du kannst dann jedes Bild in einem neuen Task bearbeiten.

Alternativ kannst du auf einen anderen Threadpool umsteigen, bei SO hatte wohl auch jemand Probleme mit TParallel.For, vielleicht hilft dir die OmniThreadLibrary weiter
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
4.958 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: TParallel.for innerhalb iTask

  Alt 13. Aug 2019, 08:26
Was genau soll dein Beispiel-Quellcode verdeutlichen? Egal auf welchen Buttons ich herumpatsche, ich bekomme nie mehr als vier Worker-Threads. Das hätte ich auch erwartet.

Was auch immer dein "Scripting-Tool" ist - Bist du sicher dass das nicht von daher kommt? Was sagt dein "richtiges" Programm wenn es im Debugger läuft?
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
239 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TParallel.for innerhalb iTask

  Alt 13. Aug 2019, 08:45
...wenn zu schnell versucht wird, die Tasks aufzurufen bevor die Arbeit gemacht ist, dann kommen immer mehr Threads dazu...
Eigentlich schreibst du doch genau in diesem Satz, was das Problem ist.
Wieso verhinderst du nicht, das neue Threads gestartet werden, wenn noch andere laufen bzw. die mit ihrer Arbeit noch nicht fertig sind?

Ist ja logisch, das sich das dann gegenseitig immer mehr aufbaut (stark vereinfacht):

Thread 1 gestartet
Prozessoren bearbeiten 1 Thread
Thread 1 noch nicht fertig, aber nächster wird gestartet.
Prozessoren bearbeiten 2 Threads
Thread 1 und 2 noch nicht fertig, aber nächster wird gestartet.
Prozessoren bearbeiten 3 Threads
...

ggf. wird zwischendurch mal ein Thread fertig aber wenn der 1. Thread schon nicht fertig wird, bevor der zweite startet, wie sollen zwei Threads da fertig werden bevor der dritte startet usw.?

Richtig wäre:

...
Thread 1 gestartet
Prozessoren bearbeiten 1 Thread
Ein neuer Thread soll gestartet werden aber Thread 1 noch nicht fertig, daher noch keinen weiteren starten.
Prozessoren bearbeiten 1 Thread
Thread 1 fertig, nun kann der nächste gestartet werden.
Prozessoren bearbeiten 1 Thread
...
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (13. Aug 2019 um 08:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.360 Beiträge
 
Delphi 7 Personal
 
#5

AW: TParallel.for innerhalb iTask

  Alt 13. Aug 2019, 09:35
Ganz so sparsam wäre ich nicht, zwei oder drei oder... Threads würde ich mir schon erlauben. Nur steigt dann natürlich der Verwaltungsaufwand und damit der Testaufwand. Da muß man sich dann fragen ob sich das lohnt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
239 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: TParallel.for innerhalb iTask

  Alt 13. Aug 2019, 09:50
Ganz so sparsam wäre ich nicht, zwei oder drei oder... Threads würde ich mir schon erlauben. Nur steigt dann natürlich der Verwaltungsaufwand und damit der Testaufwand. Da muss man sich dann fragen ob sich das lohnt.

Gruß
K-H
War ja auch nur ein Beispiel, da müsste man sich dann halt irgendein Limit setzen.
Es ging dabei nur um die Darstellung, das sich das so (wie er es aktuell hat) natürlich auftürmen würde.

Bezüglich Verwaltungsaufwand: Könnte man recht simpel über einen "Flag" (in welcher Form auch immer) lösen, dann braucht man nicht immer nach den Threads "suchen".
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von ich2
ich2

Registriert seit: 7. Dez 2005
Ort: Würzburg
45 Beiträge
 
#7

AW: TParallel.for innerhalb iTask

  Alt 13. Aug 2019, 10:20
Vielen Dank für die schnellen Antworten.

Ja...ein Thread kommt...zwei Probleme sind da

Im Grunde ist es klar, dass man natürlich einen Thread abarbeiten lassen muss und dann einen neuen (oder besser denselben) wieder verwendet und mit einer neuen Aufgabe füttert. Leider geht da aus meiner Sicht der Sinn verloren.
Ich möchte natürlich gerade auch parallel arbeiten lassen
Mein Problem ist gerade, dass obwohl die Aufgaben fertig gerechnet sind immer wieder neue Threads erstellt werden, anstatt die 'alten' wiederverwendet und diese sich dann ansammeln.

@Der schöne Günther
einfach mal einen Stein auf die Enter-Taste legen und zuschauen, wie sich die Threads sammeln...siehe Video

https://youtu.be/9hy6n6oCzPs

Die Frage ist, wie man die Threads wieder los wird...?
Wissen ist Macht. Das ändert aber so gut wie nichts an der Übermacht der Dummheit.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.360 Beiträge
 
Delphi 7 Personal
 
#8

AW: TParallel.for innerhalb iTask

  Alt 13. Aug 2019, 13:21
.FreeOnTerminate ?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
890 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: TParallel.for innerhalb iTask

  Alt 13. Aug 2019, 13:23
.FreeOnTerminate ?
Was man dann wo und wie einbaut?

Bislang dachte ich immer diese Worker-Threads werden vom Threadpool verwaltet, aber ich lerne gerne dazu ...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf