首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BackgroundWorker DisconnectedContext

BackgroundWorker DisconnectedContext
EN

Stack Overflow用户
提问于 2012-07-15 18:10:32
回答 2查看 431关注 0票数 0

我有个折页码:

代码语言:javascript
运行
复制
public static Emgu.CV.Capture _capture;
public static DispatcherTimer _timer;
代码语言:javascript
运行
复制
_timer = new DispatcherTimer();
_timer.Interval = _settings.camera_interval;
_timer.Tick += ProcessFrame;
代码语言:javascript
运行
复制
BacgroundWorker _bw = new BackgroundWorker
{
    WorkerReportsProgress = true,
    WorkerSupportsCancellation = true
};

_bw.DoWork += (s, e) =>
{
    // Initialize the device in background
    _capture = new Capture();
};

_bw.RunWorkerCompleted += (s, e) =>
{
    _capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_HEIGHT,
        _settings.camera_height);
    _capture.SetCaptureProperty(CAP_PROP.CV_CAP_PROP_FRAME_WIDTH,
        _settings.camera_width);
    Brightness = _capture
        .GetCaptureProperty(CAP_PROP.CV_CAP_PROP_BRIGHTNESS);

    Contrast = _capture
        .GetCaptureProperty(CAP_PROP.CV_CAP_PROP_CONTRAST);

    // Get images from camera
    _timer.Start();
};

_bw.RunWorkerAsync();
代码语言:javascript
运行
复制
 public override void CleanUp()
 {
     _timer.Stop();            
     _bw.Dispose();
     if (_capture != null) _capture.Dispose();
 }

应用程序运行良好,但当我关闭应用程序时,抛出我:Message: Context0x23754b0' Disconnected. ... 如何解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2012-07-15 20:50:34

这是一个与COM相关的错误,这无疑是因为您在后台线程上创建了Capture对象。COM对象具有线程关联,一旦创建它的线程停止运行,COM对象就死了,不能再使用了。无论如何,尝试使用它都会产生警告。

这在RunWorkerCompleted事件处理程序中没有发生,这是相当值得注意的,它必须以一种不明显的方式隐藏在OpenCV或Emgu管道中。这并不意味着它不可能在某一天发生。您需要重新考虑这一点,只在工作人员上创建对象并在UI线程上运行其他所有内容都是没有意义的。对工人做每件事,包括处理。或者什么都没有。

票数 2
EN

Stack Overflow用户

发布于 2012-07-15 18:48:34

我想这与你的相机捕捉库以及它如何使用非托管资源有关。

首先,我将注释RunWorkerCompleted中的所有代码,以查看消息是否仍在发生。如果没有,那么它是由一个或多个GetCaptureProperty调用引起的。但我怀疑不会的。

我在文档 of Egmu.CV.Capture中看到,有一个Capture.DisposeObject()方法可以讨论释放捕获的对象。我的猜测是,在您实例化_capture并完成您需要做的事情之后,您必须进行清理。我建议在您的ProcessFrame完成后(或者在应用程序退出时),尝试调用_capture.DisposeObject(),看看它是否清理干净并优雅地退出。

编辑:

如果其他方法都失败了,我建议的方法是尽可能多地注释掉您的代码,这样您就可以在不引发异常的情况下退出程序。然后,对代码中的部分进行注释,直到您能够准确地找到创建或运行的内容,最终会在退出时导致异常。一旦您能够本地化它,您就会更好地了解如何修复它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11494375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档