2011-01-28 2 views
1

Я разработал приложение для непрерывного чтения потока изображения с камеры DSLR.Ошибка: объект в настоящее время используется в другом месте.

while (!liveViewExit) 
     { 
      // Create a Memory Stream 
      stream = new IntPtr(); 

      // Get the bitmap image from the DSLR 
      bmp = GetEvfImage(stream); 


      if (bmp != null) 
      { 

       // Crop the image. 
       picImage = (System.Drawing.Image)bmp.Clone(new Rectangle(10, 0, 492, 768), bmp.PixelFormat); 
       try 
       { 
        if (picImage != null) 
         this.picLiveView.Image = (System.Drawing.Image)picImage.Clone(); 
       } 
       catch (Exception ex) 
       { 
        Utility.HandleError(ex); 
       } 


      } 
     } 

После запуска некоторое время, у меня есть эта ошибка для этой строки кода:

this.picLiveView.Image = (System.Drawing.Image)picImage.Clone(); 


Object is currently in use elsewhere.( at System.Drawing.Image.get_FrameDimensionsList() 
    at System.Drawing.ImageAnimator.CanAnimate(Image image) 
    at System.Drawing.ImageAnimator.ImageInfo..ctor(Image image) 
    at System.Drawing.ImageAnimator.Animate(Image image, EventHandler onFrameChangedHandler) 
    at System.Windows.Forms.PictureBox.Animate(Boolean animate) 
    at System.Windows.Forms.PictureBox.Animate() 
    at System.Windows.Forms.PictureBox.InstallNewImage(Image value, ImageInstallationType installationType) 
    at System.Windows.Forms.PictureBox.set_Image(Image value) 

Я думаю, управление picLiveView PictureBox еще не готов принять новый образ. Любая идея, как обнаружить, если PictureBox все еще используется.

// Добавлено:

Это нить. Я думаю, что картинка не достаточно быстра, чтобы обрабатывать объект изображения в цикле while.

+0

Возможный дубликат [InvalidOperationException - объект в настоящее время используется в другом месте - красный крест] (http://stackoverflow.com/questions/1060280/invalidoperationexception-object-is-currently-in-use-elsewhere-red-cross) – John

ответ

2

Есть несколько потоков, обновляющих picLiveView изображений? Если это так, то это объяснит эту проблему. Просто используйте одну нить вместо этого, и сериализовать обновление - в качестве альтернативы вы можете использовать блокировку для доступа picLiveView:

private readonly object myLock = new object(); 
... 


if (picImage != null) 
{ 
    lock(myLock) 
    { 
     this.picLiveView.Image = (System.Drawing.Image)picImage.Clone(); 
    } 
} 
+2

Блокировка не поможет, особенно если она отображается в пользовательском интерфейсе. GDI + по своей сути не является потокобезопасным. – SLaks

0

Я знаю, я поздно ... но попробовать это, если кто-то есть такая же проблема ..

if (bmp != null) 
      { 

       // Crop the image. 
       picImage = (System.Drawing.Image)bmp.Clone(new Rectangle(10, 0, 492, 768), bmp.PixelFormat); 

    **Bitmap img = new Bitmap(picImage); 
    picImage.Dispose(); 
    picImage = null;** 

     try 
       { 
        if (picImage != null) 
         **this.picLiveView.Image = img;** 
       } 
       catch (Exception ex) 
       { 
        Utility.HandleError(ex); 
       } 


      } 
+0

Как этот код разрешает проблему? –

Смежные вопросы