C# System.Drawing.Graphics Threading oder Alternative

Gobble-G

Lieutenant
Registriert
Nov. 2002
Beiträge
727
Hallo,

ich habe eine Windows-Forms-Anwendung und möchte in einem abgespalteten Thread aufwendige Bildskalierungen durchführen. Allerdings blockiert mir der abgespaltete Thread immer den Oberflächenhauptthread, obwohl es keine sichtliche Referenzen zwischen den beiden Threads gibt.
Meine Vermutung ist, dass die Verbindung wohl im verwendeten System.Drawing.Graphics-Objekt liegt, da dieses nicht erzeugt werden kann, sondern nur über eine statische Methode der Klasse zugewiesen wird.

Daher möchte ich wissen, wie ich mit Graphics echtes Multithreading erreichen kann, so dass meine Oberfläche während der Hintergrundarbeit bedienbar bleibt.
Falls es da keine Wege gibt, suche ich eine alternative Bibliothek, mit der ich Bilder skalieren kann und die Multithreading erlaubt.
Wer weiß was?

Danke und Gruß, Gobble-G
 
Ich würde vermuten dass du ein neues Bild im seperaten Thread machen musst (den Inhalt natürlich übergeben), von diesem dann ein Graphics Objekt nehmen, skalieren, und das Bild zurückgeben.
 
In meiner Testumgebung lege ich alle Objekte innerhalb des abgespalteten Threads an. Da wird erstmal nichts übergeben und dennoch blockiert der Thread den Hauptthread. Im konkreten Fall erzeuge ich ein Image- bzw. Bitmap-Objekt und nutze dann Graphics.FromImage(...) um das Graphics-Objekt zu bekommen. Damit kann ich dann arbeiten. Aber wie gesagt, dennoch wird der Hauptthread blockiert...
 
Du solltest jegliche Berechnung in eien thread auslagern.
Wenn es nur eine kurzweilige Berechnung ist, dann empfehl ich hierbei Threadpool und nicht normale Threads.

Dann kommt noch hinzu das du aus Threads nicht direkt auf die Form zugreifen kannst da kommt dann noch invoke hinzu. Mit ein wenig Google / MSDN findest fertigen Code den du nur modifzieren brauchst.
Hab das jetzt nicht auswendig im Kopf sonst würd ichs dir reintippen.
 
Soweit waren wir schon. Lies nochmal genau. Die "Berechnung" mit Graphics läuft in einem separaten Thread. Ob Abspaltung per Delegate, Threadpool, Backgroundworker oder Thread spielt keine Rolle. Die Oberfläche blockiert, obwohl es keine Verbindung zu dieser gibt. Es werden weder Objekte bzw. Referenzen übergeben, noch wird auf Objekte der Oberfläche zugegriffen. Daher muss/kann ich auch kein Invoke() oder SynchronizationContext verwenden (Damit kenn ich mich aus!).

Also nochmal: Ich möchte wissen, ob mit dem Graphics-Objekt echte Parallelverarbeitung möglich ist (Knackpunkt Graphics-Objekterzeugung) und wenn ja, wie. Falls nicht, hätte ich gern einen Vorschlag für eine Alternative.
 
Zurück
Oben