Parallel.For Abbruch

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Danke für den Hinweis. Werde ich anschauen.

    EDIT:
    @RodFromGermany
    Ich hab das jetzt mal ziemlich rudimentär gemacht. Was meinst du dazu?
    Ich habe mir noch eine Möglichkeit erarbeitet mit MMF. Diese Variante hier ist aber auch ganz schnell.


    Freundliche Grüsse

    exc-jdbi
    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    @exc-jdbi Ich halte das für eine falsche Herangehensweise.
    Primär sollte die visuelle Kontrolle sein, nicht die Laufzeit.
    Wenn Du Pech hast, weißt Du gar nicht, was da mit Deinem Bild passiert ist.

    Von Random und look habe ich mich schon lange verabschiedet, deswegen der Tipp mit der Tabelle.
    Das Looken dauert bei sehr vielen Zugriffen nämlich ewig.
    Hole zuerst das Pixel-Array aus der Bitmap raus und pack es entweder mit 1 oder 4 Byte Per Pixel (mono, color) in ein entsprechendes Array, auf dem Du arbeiten kannst.
    Und: Für jede Operation ein neues Array, danach das alte wegwerfen bzw. für die nächste Operation bereitstellen.
    Wenn Du fertig bist, erstell eine Bitmap und blase das Array dort rein.
    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!
    @RodFromGermany

    Danke für die Antwort.

    Wenn ich dich jetzt richtig versanden habe, geht es nur um die Random-Methoden. Auch ich habe von der Lock-Bremse gelesen.
    Wenn ich ganz ehrlich bin, habe ich mir im Internet einer der möglichen Varianten rausgesucht, die ich noch für einigermassen als gut erachtet habe.

    RodFromGermany schrieb:

    Pixel-Array aus der Bitmap


    Das würde sich mit Marshal.Copy bewerkstelligen lassen (oder per Pointer). Ich nehme an du meinst genau das.
    Die daraus extrahierte Array kann ich ja sofort auf eine mono oder color reduzieren bzw. erweitern (sofern nötig).

    Das mit jeweils separaten Array (für jede Operationstufe) muss ich mir kurz ansehen. Vorstellen kann ich es mir schon, wie du das gemeint hast.

    Das zurückführen der Array sollte auch wieder möglich sein, auch wenn es eine ganz neue Array wäre. End wieder Marshal.Copy oder eventuell die Array in ein IntPtr überführen und den Scan0 zuweisen.

    Ich denke es ist da was du gemeint hast.

    Danke nochmals für die Tips. Ich melde mich wenn es nicht mehr weiter geht.

    Freundliche Grüsse

    exc-jdbi
    @exc-jdbi Jou, richtig verstanden.
    Das mit dem neuen Array pro Filter / Operator resultiert daraus, dass Du aus einer Umgebung um ein Pixel einen neuen Pixelwert generierst.
    Damit die Umgebung des nächsten Pixels noch im Ausgangszustand vorliegt, darf sie nicht schon überschrieben worden sein, also erfolgt das Schreiben in einem anderen Array.
    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!
    Guten Morgen @RodFromGermany

    Ich hab das angeschaut, und es macht wirklich sinn. Hab nochmals das gleiche Programm genommen.

    Der Random-Variante habe ich eine neue Array "rngarray" eingebaut, die ich dann per NextBytes vom Randomgenerator füllen lasse. Ich bekomm also keine Thread-Probleme, da dieser Vorgang vor Eintritt in die Parallelumgebung stattfinden. Während der Parallel.For wird "rngarray" quasi nur als "Reader" verwendet.

    Obwohl GreyScale eigentlich perfekt war (da die Variable "greyvalue" beim Generieren des IL-Codes für die Parallelumgebung entsprechend angepasst wird) habe ich auch hier eine Array eingeführt, die als "Writer" und gleichzeitig als "Reader" verwendet wird. Ich wollte wissen, ob das korrekt behandelt wird.

    Es läuft einwandfrei, und das Wechselspiel (Lesen/Schreiben in die Array) sollte so problemlos gehandelt werden, egal wie die Parallelzustände während dem Durchlauf gerade stehen.

    Das mit den verschiedenen Operationsschichten (zerlegen der einzelnen Stufen und immer wieder entsprechend ein neues Array einführen) werde ich nun in meinem grossen Projekt anwenden. Ich finde es ein gutes Vorgehen, und man behält auch so die Übersicht, vor allem für die Fehlersuche.

    Nochmals Danke für die Tips

    Freundliche Grüsse

    exc-jdbi
    Dateien