2011-02-01 6 views
1

이더넷 카메라의 매개 변수를 구성하는 C# 응용 프로그램이 있습니다. 카메라는 서버 역할을하고 응용 프로그램은 클라이언트 역할을합니다.배경 작업자가 실행되지 않음

데이터 소켓 (양방향 통신)과 이미지 용 소켓으로 데이터/명령 통신을위한 소켓이 2 개 있습니다. 카메라는 이미지 소켓을 통해 이미지를 전송합니다 (단방향 통신). 하드웨어 트리거가 주어질 때마다 카메라가 이미지 소켓을 통해 이미지를 전송합니다 (하드웨어 트리거가 올 때 예측할 수 없음).

사용자는 GUI의 값을 변경하여 카메라를 구성 할 수 있습니다. 사용자가 매개 변수를 변경하면 응용 프로그램은 명령 소켓을 통해 명령과 데이터를 카메라로 보내고 응답을 기다립니다 (수신 제한 시간은 5 초입니다). 카메라는 명령을 수신하고 응답을 되돌려 보냅니다. GUI는 성공적으로 업데이트 된 사용자를 업데이트합니다.

이미지 소켓을 배경 작업자에 배치했습니다. 내부 무한 루프가 이미지 소켓의 이미지 폴링을 유지하고 이미지를 수신 할 때마다 GUI에 표시됩니다 (대리인을 사용하여 수행). 모두 잘 맞습니다 :)

이제 트리거가 카메라에 도달하면 이미지를 보냅니다. 사용자가 매개 변수를 변경하는 즉시, 응용 프로그램은 명령/데이터를 전송하고 응답을 기다립니다. 카메라는 이미지를 완전히 보낸 후에 만 ​​명령을 수신합니다. 응용 프로그램이 명령에 대한 응답을 기다리고있을 때 백그라운드 작업자 (이미지를받는)가 실행 중이 지 않은 것입니다. 따라서 UI는 명령 소켓에서 응답을 기다리고 있으며 카메라는 이미지 소켓에 이미지를 보내고 UI는 백그라운드 작업자가 실행되고 있지 않아 이미지를받지 못합니다. 교착 상태가되어 명령 소켓에서 시간 초과 (5 초)가 발생합니다.

소켓이 시간 초과 대기 중일 때 backgroundworker가 실행되지 않는 이유 백그라운드 작업자를 스레드로 교체하고 우선 순위를 다음과 같이 설정했습니다. 가장 높은. 오류 (시간 초과) 주파수가 내려왔다,하지만 동일한 문제가 occasionaly 발생합니다. 당신들의 날이 정렬하고 나에게 문제를 이해하는 데 도움이 도움이 될 수 있습니다.

감사합니다, 비슈누

답변

1

백그라운드 작업자의 이미지를 새로 고치는 데 사용되는 대리자가 BeginInvoke를 사용하여 비동기 적으로 호출되도록하는 것이 좋습니다. 동기식 호출로 인터 로킹이 발생할 수 있습니다.

+0

이것은 효과가 있습니다. Johnan Bias 고맙습니다. – Vishnu

0

을 보지 않고 코드를 이해하기가 약간 어렵지만이 문제는 응답 대기중인 애플리케이션 UI와 관련이 있다고 의심됩니다.

명령을 보낸 후 어떤 스레드가 대기 중입니까? UI 스레드가 나쁜 디자인이라면 UI 스레드는 아무 것도 기다리지 않아도됩니다.

명령/데이터 소켓을 통해 통신하는 데 사용되는 다른 스레드를 만듭니다. UI는 ConcurrentQueue<T> 또는 BlockingCollection<T>에 명령을 입력하기 만하면됩니다. 데이터 소켓을 소유 한 스레드는 대기열에서 명령을 사용하여 카메라로 전송하고 최대 5 초 동안 기다린 다음 UI에 (Invoke를 사용하여) 메시지를 다시 게시합니다. 이 스레드는 한 번에 하나의 명령 만 활성화되도록 명령/데이터 소켓에 대한 모든 액세스를 직렬화합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 당신이 제안하고 돌아 오는이 접근법을 시도 할 것입니다. 앞서 말했듯이 명령 소켓은 UI 스레드에서 대기 중입니다. – Vishnu

+0

VS2008을 사용하고 있습니다. 이 일을하는 방법이 있습니까? – Vishnu

관련 문제