Ошибка: объект в настоящее время используется в другом месте. - PullRequest
2 голосов
/ 28 января 2011

Я разработал приложение для непрерывного считывания потока изображения с цифровой зеркальной камеры.

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 все еще используется.

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

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

Ответы [ 2 ]

2 голосов
/ 28 января 2011

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

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


if (picImage != null)
{
   lock(myLock)
   {
      this.picLiveView.Image = (System.Drawing.Image)picImage.Clone();
   }
} 
0 голосов
/ 11 января 2012

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

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);
                }


            }
...