2 dansouyong dansouyong 于 2016.04.21 22:48 提问

emgucv Caputre类在打开摄像头的情况下,关闭子窗口,会产生中断错误

这是子窗口关闭时,调用的代码


        private void VideoWnd_FormClosing(object sender, FormClosingEventArgs e)
        {
            capture.Pause();
            capture.Stop();
           for(int i=0;i<999999999;i++)
            {
                if (capture._grabState == Emgu.CV.Capture.GrabState.Stopped)
                    capture.Dispose();
            }

        }

修改Capture类的结构体,查看_grabState字段始终未stopping状态

下面为Capture类中线程运行代码

 private void Run()
        {
            try
            {
                while (_grabState == GrabState.Running || _grabState == GrabState.Pause)
                {
                    if (_grabState == GrabState.Pause)
                    {
                        _pauseEvent.WaitOne();
                    }
                    else if (IntPtr.Zero.Equals(_ptr) || !Grab())    
                    {
                        //capture has been released, or
                        //no more frames to grab, this is the end of the stream. 
                        //We should stop.
                        _grabState = GrabState.Stopping;
                    }
                }
            }
            catch (Exception e)
            {
                throw new Exception("Capture error", e);
            }
            finally
            {
                _grabState = GrabState.Stopped;
            }
        }

在子窗口中添加按钮,关闭摄像头能够正常工作。
在摄像头打开的情况下,直接点击关闭按钮,无论怎样都会产生catch错误,
错误为:引用已经释放的对象,ImageBox

1.理论上不是我在VideoWnd_FormClosing事件中调用了capture.stop()方法,线程不就应该调用finally中的代码么,但是直到for循环结束,线程都没有调用。不知道为什么

1个回答

devmiao
devmiao   Ds   Rxr 2016.04.21 22:49
dansouyong
dansouyong 我的摄像头能正常打开与工作,我是用子窗口打开的摄像头,此时关闭子窗口,摄像头线程就会报错
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!