2016-06-15 5 views
0

GPS 위치에 대해 일정 시간 간격으로 브로드 캐스트되는 UDP 패킷이 있습니다. 현재 50ms마다 방송됩니다. 각각의 새 패킷마다 발생하는 이벤트 처리기가 있고 패킷을 처리하고 다른 코드를 호출합니다. 방송은 상당히 일관성이 있지만 약간 변동될 수도 있습니다. 패킷이 속도를 올리거나 코드가 끊어지기 때문에 다음 패킷이 너무 빨리 또는 너무 빨리 들어 왔기 때문에 다음 이벤트가 발생할 때까지 기다리지 않고 돌아 왔으므로 이벤트 큐 문제가 발생하기 시작합니다. 호출중인 코드가 완료되지 않았습니다.이벤트 처리기 타이밍 문제

그래서이 질문은 이벤트 처리기가 여기에서 사용하는 것이 가장 좋은가요? 나는 그들이 다음 질문을 제기하는 것, 나는 다음 패킷을 준비 할 수 있도록 최선을 다할 것이라고 생각한다. 패킷이 너무 빨리 온다 문제에 대해서는

  1. 는, 어쩌면 난 그냥 드롭하고 다음 기다립니다

    나는이 생각을 가지고있다. 다시 말해, 50ms마다 나에게 도움이된다면, 나는 그것을 임계 값으로 설정합니다. 패킷이 30ms 만에 들어온다면 너무 빠르다는 것을 알았고 다음 패킷을 기다리면서 타이밍의 변동이 나를 영향을 미치지 않도록했습니다. 이것은 무언가가 헤이 와이어로 바뀌고 패킷이 1ms마다 전송되는 경우에 좋은 보호 기능입니다.

  2. 이벤트 처리기의 경우 처리기는 수신 대기하고 수신하지만 처리 또는 처리 할 스레드를 시작하여 이벤트 처리기가 즉시 반환하여 다음 패킷을 준비 할 수 있습니까? 이것은 내 마음이 내게 말하기 때문에 후속 스레드가 이전 스레드보다 빠르게 완료되는 문제를 동기화 할 수 있다고 알려주기 때문에 (내가 스레드라고하지만 작업이나 스레드 풀 일 수 있음) 이제는 동기화가 모두 불가능할 수 있습니다. GPS 위치 같은 것에 문제가 있습니다. 이런 식으로 구현하고 잠재적 인 동기화 문제를 처리하는 방법을 잘 모르겠습니다.

도움말 및 의견을 보내 주시면 감사하겠습니다.

감사합니다.

+0

50 밀리 초는 최신 기계에서는 정확히 "너무 빠릅니다". 그러나 당신의 프로그램은 확실히 그 동안 한참 동안 긴장성이 될 수 있습니다. 사이에 1 밀리 초 미만의 간격으로 두 개의 패킷을 바로 얻을 수있는 가능성을 반드시 고려해야합니다. * lock * 키워드를 사용해야 할 수도 있습니다. 정상적인 방법은 프로그램을 * 매우 * 높은 속도로 테스트하는 것입니다. 안정적으로 작동하면 50msec 속도로 정상적으로 작동한다는 것을 알게됩니다. –

답변

1

여기서 중요한 것은 이벤트 처리기를 가능한 한 작게 만드는 것입니다. 따라서 빠른 수신 패킷을 모두 처리하는 여러 이벤트 처리기를 쌓아 두지 마십시오.

기본적으로 이벤트 처리기가 수신 대기열에 들어오는 메시지가있는 대기열이있는 것 같습니다. 그러나 패킷을 처리하기 위해 이벤트 처리기를 사용하고있는 것으로 생각됩니다.

들어있는 패킷을 공유 대기열 인스턴스에 추가하는 경우에만 이벤트 처리기를 사용하는 것이 좋습니다. 그런 다음 항목을 대기열에서 꺼내어 처리하는 백그라운드 스레드를 가질 수 있습니다. 즉, 패킷이 얼마나 빨리 들어오는 지 상관하지 않습니다.

+0

이 솔루션에 동의합니다. Event Handler가 들어오는 객체를 Stack 또는 Queue에 넣기 만하면됩니다. 따라서 나중에 큐를 처리 할 수 ​​있습니다. threadsafety가 필요한 경우 ConcurrentQueue를 권합니다. 건배 – lokusking

+0

감사합니다.이 문제를 조사하고 첫 번째 전달을 시도하겠습니다. 구현 중에 문제가 발생하면 다시 게시 할 것입니다. –