Thread Problem mit dem Graphics Objekt

24/10/2008 - 08:46 von Marco Maetzler | Report spam
Hallo NG,

Ich kàmpfe zur Zeit mit einem Problem das mich total fertig macht :)

Ich habe da einen Thread welcher 3 mal instanziert wird. Jeder Thread hat
einen lokalen Member, ein Bitmap. Und jeder Thread zeichnet in seinem
eigenen Bitmap rum. Doch ich krieg immer eine InvalidOperationException mit
der Meldung "Object is currently in use elsewhere".

Ich habe hier mal kurz ein bisschen Pseudocode und ein paar Worte zum code:
- Global.Lock ist ein globales statisches Lockobjekt über das ich
verzweifelt versuche meine 3 Thread zu synchronisieren.
- PrintWindow ist ein WinApi call.
- _picture ist ein lokaler Member des Threadobjekts.

lock (Global.Lock)
{
Graphics g = null;
try
{
g = Graphics.FromImage(_picture);
IntPtr hdc = g.GetHdc();
PrintWindow(_windowHandle, hdc,0);
g.ReleaseHdc(hdc);
}
finally
{
g.Flush();
g.Dispose();
g = null;
}
}

Mein Problem ist, dass die erste Zeile im Try-Block hin und wieder zu einer
Exception führt.
Aber das Lock-Statement sollte doch meine Threads davon abhalten
gleichzeitig in diesen Codeabschnitt zu gelangen?
Graphics.FromImage ist doch eine Statische Methode des Graphics Objekt. Das
sollte ich doch jederzeit aufrufen können oder nicht?
Was kann ich dagegen tun? Kann ich irgendwie prüfen ob jemand anderes das
Graphics Objekt gerade verwendet?

Vielen Dank für eure Hilfe und Gruss,
Marco
 

Lesen sie die antworten

#1 Frank Dzaebel
24/10/2008 - 21:30 | Warnen spam
Hallo Marco,

Ich habe hier mal kurz ein bisschen Pseudocode und ein paar Worte zum
code:



Pseudo-Code ist da nicht so gut, aber mal
schauen.

[...]
g = Graphics.FromImage(_picture);
IntPtr hdc = g.GetHdc();
PrintWindow(_windowHandle, hdc,0);
g.ReleaseHdc(hdc);

Mein Problem ist, dass die erste Zeile im Try-Block hin und wieder zu
einer Exception führt.



Nach "g = Graphics.FromImage(_picture);"
darfst Du *keine* GDI+ Calls mehr durchführen,
bis Du das Released hast! Nun fragst Du Dich,
"aber das mache ich doch auch gar nicht ..",
richtig, aber (z.B.) wohl sporadisch die Paint-Routine,
die wahrscheinlich keine Locks eingebaut hat?

Ansonsten mal hier suchen:

["Object is currently in use elsewhere" ReleaseHdc GetHdc - Google-Suche]
http://www.google.de/search?hl=de&a...Hdc+GetHdc


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen