Laden...

Bitmap in einer Threadroutine?

Erstellt von amozi vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.396 Views
A
amozi Themenstarter:in
120 Beiträge seit 2005
vor 18 Jahren
Bitmap in einer Threadroutine?

Hi,

ich habe eine ungewöhnliche Fehlermeldung und weißt nicht warum sie auftritt.
Ich möchte in einer Threadroutine eine Zeichnung vornehmen und diese dann anzeigen.

private Bitmap sigBitmap_1 = new Bitmap(5000,5000,System.Drawing.Imaging.PixelFormat.Format32bppArgb);
public void sigZeichnung()
{
      while(this.projektspeicher.startSigApp)
     {
            lock(this)
           {
                   // diese nächste Zeile verursacht den Fehler
                   this.sigBitmap_1.SetPixel(y,(System.Int16)this.sigDaten[0][y],System.Drawing.Color.Blue);
	   this.pictureBoxSigBitmap_1.Image = this.sigBitmap_1;		   this.pictureBoxSigBitmap_1.Refresh();
            }

Ich muss noch sagen, dass die Routine bis zu den Zeichenoperationen funktioniert hat.

Die Fehlermeldung: Das Objekt wird auch irgendwo anders benutzt.
--> Es wird aber nicht!!!

Danke

Danke
amozi

S
8.746 Beiträge seit 2005
vor 18 Jahren

Wie immer gilt: Niemals von einem Thread aus direkt GUI-Operationen vornehmen. Stichwort: Invoke/BeginInvoke.

A
amozi Themenstarter:in
120 Beiträge seit 2005
vor 18 Jahren

Danke svenson,

für die Stickworte.

Danke
amozi

A
amozi Themenstarter:in
120 Beiträge seit 2005
vor 18 Jahren

Hallo,

nach svenson's vorschäge habe ich endlich hingekriegt, dass ich die Zeichnung ohne Probleme vornehmen kann. Ich habe in die obige Threadroutine einen Delegaten eingefügt und führe in seiner Funktion die Zeichnung durch.
Aber was mich noch stört ist der kurzeitiger Anzeigezustand des Formulars beim Aufrufen. Unzwar ist es so, dass die Steuelemente in der GUI-Thread (wie Bitmap,Picturebox) ein Loch im Formular verurschen, das 1-2Sekunden dauert. Das Grafikfenster wird viel früher erzeugt (auch die erwähnten Steuelemente) Trotzdessen tritt dieses Problem kurzzeitig beim ersten Anzeigebefehl (this.Show())auf. Momentan ist es auch so, dass keine zusätzlichen Zeichenoperationen dazu gekommen sind.
Ich weiss nicht mit was das zutun hat und habe keine Ahnung wie ich das anpacken soll. Wie kann man den Anzeigevorgang der Steuelemente beschleunigen?
Danke für die Vorschläge oder auch für die Stichpunkte.

Danke
amozi

A
amozi Themenstarter:in
120 Beiträge seit 2005
vor 18 Jahren

Hi,

ich wollte mal fragen, ob ihr mir keine Ideen oder Stichpunkte zu diesem Problem schenken würdet?

Danke

Danke
amozi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo amozi,

wie schnell ist der Rechner, auf dem das Phänomen auftritt?

herbivore

A
amozi Themenstarter:in
120 Beiträge seit 2005
vor 18 Jahren

Pentium4 1.6GHz.

Vielleicht ist es nützlich noch zu erwähnen, dass dabei noch 2 Synchronthread's, 1 Asynchronthread (also der Thread sigZeihnung()) und dazugehöriger GUI-Thread am Laufen sind.

Danke
amozi

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo amozi,

dann könntest du doch (mindestens versuchsweise) diese Threads solange anhalten, bis das Show durchgeführt wird. Ansonsten könnte es sein, dass das Zeichen zu lange dauert. Da die mit BeginInvoke aufgerufenen Methoden im GUI-Thread laufen, blockieren diese Methoden auch das GUI, solange sie laufen.

herbivore

A
amozi Themenstarter:in
120 Beiträge seit 2005
vor 18 Jahren

Danke herbivore für die Tips.

Danke
amozi