2012-07-15 59 views
0

我有folling代碼:BackgroundWorker的DisconnectedContext

public static Emgu.CV.Capture _capture; 
public static DispatcherTimer _timer; 
_timer = new DispatcherTimer(); 
_timer.Interval = _settings.camera_interval; 
_timer.Tick += ProcessFrame; 
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(); 
public override void CleanUp() 
{ 
    _timer.Stop();    
    _bw.Dispose(); 
    if (_capture != null) _capture.Dispose(); 
} 

應用程序工作正常,但是當我關閉應用程序扔給我:Message: Context0x23754b0' Disconnected. ...如何解決這個問題?

回答

1

我認爲這與您的相機捕捉庫以及它如何潛在地使用非託管資源有關。

我會先評論RunWorkerCompleted以外的所有代碼,看看這個消息是否仍然發生。如果沒有,那麼它是由一個或多個GetCaptureProperty調用引起的。我懷疑它不會。

我在Egmu.CV.Capture的documentation中看到有一個Capture.DisposeObject()方法說明釋放捕獲的對象。我的猜測是,當你實例化_capture並且你做了你需要做的事情之後,你必須做一個清理。我建議您在ProcessFrame完成(或退出應用程序)後,嘗試撥打_capture.DisposeObject()以查看是否清理並退出正常。

編輯:

如果一切都失敗了,我會建議的方法是註釋掉儘可能多你的代碼,你可以去那裏你可以退出程序沒有它拋出一個異常點。然後,在部分代碼中進行註釋,直到您可以準確找到創建或運行的內容,這些內容最終會導致出現異常。一旦你可以本地化,你會有更好的想法如何解決它。

+0

我忘了清理方法。我會寫 – rkmax 2012-07-15 18:51:45

+0

@rkmax,就像一個很好的做法,我會按照與創建相反的順序處理Dispose,然後嘗試顯式的Capture.DisposeObject()方法。哦,我會從這些字段中刪除'static'修飾符......實際上可能是問題所在。 – 2012-07-15 19:01:54

+0

我試過靜態和無靜態 – rkmax 2012-07-15 19:04:03

1

這是一個COM相關的錯誤,它無疑是因爲您在後臺線程上創建Capture對象而發生的。一個COM對象具有線程關聯性,一旦創建它的線程停止運行,COM對象就已經死了,不能再使用了。無論如何試圖使用它會產生警告。

這在RunWorkerCompleted事件處理程序中不會發生,這非常明顯,它必須以非明顯的方式隱藏在OpenCV或Emgu管道中。這當然並不意味着它有一天不會發生。您需要重新考慮這一點,僅在worker上創建對象並讓其他所有內容在UI線程上運行都沒有多大意義。對工人做一切事情,包括處置。或者沒有。