Ausbremsung der Applikation bei Threads und Tasks

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Ausbremsung der Applikation bei Threads und Tasks

    Moin Leute,
    ich habe eine Anlage, bei der bewegungsgetriggert mit 3 Kameras je nn Bilder aufgenommen und ausgewertet werden.
    Das ganze läuft in einem Thread, um die GUI nicht zu blockieren.
    Die Auswertung ist in 2 Teile gesplittet:
    1. während der Bewegung in je einer Task pro Kamera und Bild,
    2. nach Beendigung der Bewegung mit einem Parallel.For pro Kamera.
    Folgendes Problem macht mir das Leben schwer:
    Bis ca. 60 Zyklen käuft das ganze flott durch.
    Nach ca. 60 Zyklen wird das ganze drastisch langsamer.
    Folgende mögliche Ursachen sind untersucht und verworfen:
    • (beliebige) Aufteilung der Auswertung während / nach der Bewegung / Bildaufnahme,
    • Memoryleaks - Kontrolle TaskManager,
    • unmanaged Ressourcen - spezieller Monitor,
    • Überschneidung von Tasks - Exception, Log,
    • die Motorbewegung - passiert auch bei simuliertem Motor,
    • die Bildverarbeitung - passiert auch bei simulierter Bildverarbeitung.
    Aber:
    Es passiert nicht, wenn bei laufendem Motor und simulierter Bildverarbeitung kein Task gestartet wird AndAlso kein Parallel.For aufgerufen wird.
    Dies alles passiert innerhalb des oben genannten Threads.
    Kann es sein, es da nicht aufgeklärte Thread-Task-Parallel-Effekte gibt?

    Danke für Eure Ideen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Findest nicht, dass pro Bild ein neuer Task etwas overkill ist? Würde eher versuchen normale Threads zu starten von mir aus pro Kamera 1-3 Threads (mit einem anfangen) und die Bilder aus einer threadsafe queue holen, verarbeiten und wieder wegschicken. Wenns auf die Reihenfolge drauf an kommt musste nat. das auch noch berücksichtigen. Haste mal geschaut wie viele Threads da offen sind wenn er eine gewisse Anzahl von Zyklen durch hat?
    Und wenn er langsamer wird, halte den mal irgendwo an und schau mal ThreadPool.GetAvailableThreads wie viel Kapazitäten noch verfügbar sind.
    Das Problem das ich sehe ist, dass die Verarbeitung eines Bildes wahrscheinlich länger geht als die Dauer bis du ein neues Bild bekommst. Dadurch sammeln sich da im Laufe der Zeit Tasks ohne Ende an.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    ErfinderDesRades schrieb:

    entstehen da 600 Taskse?
    Nacheinander schon, aber nicht parallel.

    thefiloe schrieb:

    ThreadPool.GetAvailableThreads
    zeigt nach jeder Runde (nach kompletter Bewegung und nach kompletter Auswertung) die volle Kapazität an.
    Ich habe das Gefühl, dass da die laufenden Tasks nicht mitgezählt werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So. Endlich aufgeklärt.
    Es lag an einer Third Party Software, die wir inzwischen upgedatet haben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!