2012-10-30 2 views
2

음, 나는 Aforge (비디오 라이브러리)를 기반으로 프로그램을 만들었습니다.
이 라이브러리는 카메라의 다음 비디오 프레임에 대해 고유 한 새로 고침 이벤트를 만듭니다.
지금까지 좋은 사람들은 멀티 스레딩을 도와 주었기 때문에 Aforge 스레드가 메인 프로그램 스레드에 다시보고 할 수 있었으므로 지금까지는 그렇게 좋았습니다. how to do multithreading when using outside referenced code멀티 스레드 프로그램을 올바르게 종료하는 방법

을하지만 지금은 정기적으로 새로운 프로그램 오류주의 사항 :

테 코드는 여기에서 볼 수 있습니다.
프로그램을 끝내고 싶을 때 문제가 시작됩니다.
현재 Aforge 스레드가 여전히 활성 상태 일 수 있습니다.
그리고 닫힌 메인 폼에 다시 쓰려고합니다.

어쨌든 나는 프로그램을 닫기 전에 다른 스레드를 중지해야합니다.
Aforge에는 카메라 멈춤과 같은 일을하는 옵션이 있지만 충분하지 않습니다.
하지만 여전히 내 코드는 이미 닫혀있는 기본 양식에 쓰려고합니다.

모든 스레드를 중지 할 수있는 방법이 있습니까, 아니면 일부 안전도가 원래 스레드에서 닫히지 않았습니까? 심지어 try catch 구조에서 주 프로그램에 대한보고를 배치했으나 제대로 작동하지 않았습니다. 이러한 상황에서 중지하는 유일한 방법은 Visual Studio 자체에서 실행 중지 버튼을 누르는 것입니다.

답변

2

정확하게 문제를 이해 한 경우 양식을 닫은 것처럼 Invoke 전화가 양식에 표시 될 수 있습니다. 나는 이것도 잘 일어났습니다.

내가 수행 한 작업은 양식을 닫을 때 AppDomain.CurrentDomain.UnhandledException을 사용하여 InvalidOperationException (또는 무엇이든지간에)을 감시하고 종료가 설정되어 있으면 무시하는 것입니다.

+0

Invoke 대신 BeginInvoke를 사용하는 것이 더 간단 할 것입니다. UI를 업데이트하기 위해 UI에서 기다리는 작업자 스레드가 정말로 필요합니까? BeginInvoke를 사용하면 메시지 대기열에서 메시지가 제거되지 않는 PostMessage 호출이기 때문에 분리 된 Invoke 호출을 남기지 않습니다. – Tergiver

+0

... 물론 BeginInvoke는 다른 (잠재적 인) 문제가 있습니다. 작업자 스레드가 너무 길어지면 BeginInvoke가 호출을 삭제하기 시작합니다 (최대 대기열 크기가 일부 있음). 근로자가 파열하거나 너무 많은 전화를 올리지 않으면 문제가되지 않습니다. 그것이 하나가된다면, 당신은 노동자를 조종하기위한 또 다른 방법을 찾아야 만합니다. – Tergiver

+0

음, 자체 프레임 속도로 usb 웹캠을 사용 했으므로 빨리 내 계산을 수행 할 수 없습니다. 하지만 그 모든 여전히 베타 초안, 그래서 지금 내 코드는 내 웹캠보다 빠르다 ..하지만 카메라가 내 코드를 빨리 갈 수 없어, 본질적으로 내 계산이 끝내야 할 것 같아. 어쨌든 BeginInvoke에 대해 내가 뭔가를 놓친 경우에 대비하여 책을 읽게 될 것입니다. 그것의 조금 단단한 주제 반죽 – user613326