[c#] displayen bitmap gaat heel soms fout

Pagina: 1
Acties:

  • Bint
  • Registratie: Juli 2002
  • Laatst online: 30-11 17:32
Ik heb een applicatie gemaakt waarmee beelden uit een webcam worden gehaald, en kunnen worden weergegeven op een picturebox. Nu gaat dit bijna altijd goed, maar heel soms krijg ik de volgende fout:
System.InvalidOperationException was unhandled
Message="Object is currently in use elsewhere."
Source="System.Drawing"
StackTrace:
at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()
at System.Windows.Forms.PictureBox.ImageRectangleFromSizeMode(PictureBoxSizeMode mode)
at System.Windows.Forms.PictureBox.get_ImageRectangle()
at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Try2.Controller.MainController.InitializeMVC() in C:\Documents and Settings\lijtenb\My Documents\afstuderen\Code\try3\Try2\Controller\MainController.cs:line 49
at Try2.Controller.MainController..ctor() in C:\Documents and Settings\lijtenb\My Documents\afstuderen\Code\try3\Try2\Controller\MainController.cs:line 32
at Try2.Program.Main() in C:\Documents and Settings\lijtenb\My Documents\afstuderen\Code\try3\Try2\Program.cs:line 17
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Mijn applicatie is volgens MVC opgebouwd. Als ik een melding krijg dat er een nieuw frame beschikbaar is, haalt mijn view die eigenhandig op in het model. Nu heb ik het vermoeden dat er soms al een nieuw image wordt opgehaald, terwijl de huidige bitmap nog getekend wordt. Heeft iemand hier een oplossing voor? Kan ik er bijvoorbeeld voor zorgen dat er niet een nieuw image wordt opgehaald op het moment dat ik in mijn picturebox aan het tekenen ben?

Memories of yesterday, will grow, but never die


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Iedere keer als je ene aanmaakt, even 'ingebruik = true;' doen oid, en dan als je klaar bent met tekenen ed... dat weer op false zetten.


Ergens anders check je dan eerst of die in gebruik is...

Going for adventure, lots of sun and a convertible! | GMT-8


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Snakiej schreef op woensdag 07 februari 2007 @ 16:18:
Iedere keer als je ene aanmaakt, even 'ingebruik = true;' doen oid, en dan als je klaar bent met tekenen ed... dat weer op false zetten.


Ergens anders check je dan eerst of die in gebruik is...
Maak dan wel gebruik van locking mechanismes anders ben je nog steeds niet thread safe bezig. En zo te zien wordt het image in een andere thread geladen als dat hij getekend wordt.

Het ligt er een beetje aan hoe je je plaatje laad, wat de beste manier is om het op te lossen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Het kan gebeuren als het vorig object nog niet gedisposet is.

Gebruik daarom:
C#:
1
2
3
4
Image image = null;
using (Bitmap tmpBitmap = new Bitmap(filename)) // vul voor filename evt. de stream in
  image = new Bitmap(tmpBitmap);
// de afbeelding staat nu in image en tmpBitmap is gedisposed