2012-06-15 3 views
0

이 문제와 관련없는 모든 항목을 수행하는 작은 디스플레이 장치와 인터페이스하는 C#으로 프로그램을 작성하고 있습니다.응답을 기다리는 스레드가 죽는 중

문제는 다음과 같습니다. 사용자가 장치에 대한 일부 설정을 저장하려고 시도하는 단추를 선택하면 확인 프로토콜을 사용하여 설정이 (의미 - It 설정을 전송 한 다음 장치로부터 확인 응답 패킷을 기다립니다.) 시도 할 스레드의 "상위"스레드가 될 주 응용 프로그램에서 스레드를 생성합니다. 장치에 저장하십시오. 현재 다음과 같은 방식으로 작동합니다.

  • 스레드 생성 -> 저장하려고합니다. 초과하면

  • , Thread.Interrupt 통해 인터럽트 스레드 1 (장치 데이터의 잠금을 해제)() < -----는이 문제이다. 이것은 작동하지 않습니다. 장치를 끄거나 플러그를 뽑을 때까지 잠금 장치를 굵게 표시합니다. (그러면 새로운 스레드가 생성되지만, 지금은 발생하지만 첫 번째 스레드가 여전히 데이터를 잠그고 있기 때문에 결코 작동하지 않습니다.)

  • 스레드가 시간 초과되지 않은 경우 스레드 1에 대한 콜백을 통해 부모 스레드는 더 이상 스레드를 생성하지 못하게됩니다.

  • 마지막으로 성공한 스레드가 없으면 전체 시도가 실패합니다.

  • 는 I는 또한 디바이스로부터의 응답을 기다릴 때 그 장치까지 완전히 멈추는 동일한 동작을 나타내는 생성 종료되는 단지 단일 스레드로 이렇게 시도

    는 전원이 꺼 지거나 분리되는

.

대기 호출을 절대로 남기지 않으므로 스레드를 중지하도록 설정할 수있는 부울을 사용하여 장치가 ack를 보내길 기다리는 캡슐화 방법이 없습니다. 임베디드 소프트웨어이므로 기다리는 기능을 수정할 수 없습니다. 임베디드 소프트웨어에 대한 C# 인터페이스 만 수정할 수 있습니다.

+0

사용중인 .NET Framework 버전은 무엇입니까? –

+0

.NET 4.0을 사용 중입니다. –

+0

마지막 지점에 대해서는 명확하지 않습니다. 함수가 ACK를 기다리기 위해 호출되었지만 그 함수가 존재하며 임베디드 시스템이 아닌 호스트에서 실행되기 때문에 왜 수정 될 수 없습니까? 차라리 폐쇄 소스 드라이버입니까? 또한 ACK가 수신되지 않은 이유를 궁금해해야합니다. – Clifford

답변

0

인터럽트 대신 Thread.Abort를 사용해야합니다. 자세한 내용은이 스레드를 참조하십시오. Abort Vs Interrupt

이렇게하면 문제가 해결됩니다.

+0

다른 스레드에서 중단을 호출하여 별도의 스레드를 종료 할 수 없습니다. 음, 할 수는 있지만 스레드를 중단하는 것입니다 (메인 스레드가 될 것입니다 ...) –

+0

그런 경우 비동기 스레드에 대한 시간 초과 패턴을 구현해야합니다. 이것 좀 봐 http://stackoverflow.com/questions/710070/timeout-pattern-how-bad-is-thread-abort-really. 이것은 단지 아이디어 일뿐입니다. 이 문제가 주위에 있다면 귀하의 경우에 도움이 될 수 있다고 생각합니다. – Tabish

+0

불행히도이 스레드는 나를 위해 데이터를 가져 오려고합니다 (부울에 응답 함). 이 스레드는 데이터 유효성을 유지하는 방법을 설명하지 않습니다. 부울을 휘발성으로 설정하면 중단/일시 중단 된 스레드는 잠금을 해제하지 않는 것처럼 보이지만 비 휘발성으로두면 손상 될 수 있습니다. –

2

스레드 1이 ACK를 영원히 기다리고 있다고 생각하는 것 같습니다. 그리고 다른 스레드가 시간 초과 조건을 감지하고 스레드 1을 인터럽트하려고합니다. 스레드 1은 영원히 기다리지 말고 ACK를 기다리는 동안 시간 초과되어야합니다. 그런 다음 스레드 1은 재 시도하거나 오류와 함께 종료 할 수 있으며 다른 스레드의 인터럽트가 필요하지 않습니다.

+0

나는 당신이 무슨 뜻인지 모르겠다. 스레드가 함수 호출을 기다리는 동안 실행이 끝나면 호출 자체가 시간을 늘리지 않습니다. 점령 당했어. 그것은 점령되기 때문에 자체의 외부에서 중단되어야합니다. –

+0

@kkrambo는 스레드 1을 수정하여 시간 초과 조건을 인식하도록 제안합니다. 이것은 결과를 폴링하는 것과 같은 일을하는 것일 수 있습니다. 스레드가 잠금 상태에 대한 자세한 내용을 보지 않고도 특정 제안을하는 것은 약간 어렵습니다. –

+0

스레드가 호출 한 함수가 영원히 실행되어서는 안됩니다. 그것은 시간 초과 및 오류를 반환해야합니다. 일부 통신 포트에 대해 Read() 함수를 호출하고 있다고 생각합니다. Read()를 호출 할 때 제한 시간을 지정할 수 있어야합니다. 또는 통신 포트를 열 때 제한 시간을 지정할 수도 있습니다. 아니면 통신 포트가 아니지만 플래그 비트를 폴링하는 것과 같은 간단한 것일 수도 있습니다. 이 경우 영원히 국기를 조사해서는 안됩니다. 타임 아웃 후에 포기하십시오. – kkrambo

관련 문제