문제

내 질문은 내가 올바른 접근 방식을 취하고 있는지 확인하고 스레딩을 올바르게 처리하는 방법에 대한 피드백을 위한 것입니다.내 스레드 중 일부를 설정해야 할 것 같아서 모든 피드백을 환영합니다.

내가 가진 문제는 0개 이상의 RFID 리더에서 RFID 태그를 읽는 것입니다.한 명의 독자가 문제 없이 읽을 수 있으므로 여러 명이 읽는 것도 문제가 되지 않습니다.리더가 읽은 각 태그 또는 태그 배치는 .Net 이벤트에 의해 전달됩니다.

내 계획은 리더, 연결, 시작, 중지 등을 유지 관리하는 ReaderControl 클래스를 설정하는 것입니다.이번 수업은 다음의 내용을 듣게 됩니다. 태그읽기 독자님들의 이벤트.처리하는 각 이벤트(대략 250ms마다)에서 읽기 태그 ID(문자열)를 HashSet에 넣어 고유하게 유지하며, HashSet은 ReaderControl에 있습니다.ReaderControl에는 500ms마다 실행/경과되는 타이머가 포함됩니다. 이 TimerElapsed 이벤트는 지금까지 모든 판독기에서 읽은 태그를 패키지화하고 오류를 발생시키는 ReaderControl에 의해 처리됩니다. 태그읽기 이벤트.그 목적은 이벤트 실행을 최소한으로 유지하고 중복 태그를 줄이는 것입니다.

그만큼 태그읽기 이벤트는 TagTranslator라는 다른 클래스에 의해 처리됩니다.이 클래스는 태그 ID(문자열)를 반복하여 태그가 참조하는 내용을 알아냅니다.IPerson 객체.이 클래스는 번역이 완료되면 이벤트를 시작합니다. 본 사람 이벤트.

그만큼 본 사람 이벤트는 GUI(MVP 패턴)의 모델에 의해 처리됩니다.전반적인 아이디어는 GUI 디스플레이가 RFID 리더를 통과하는 사람들의 이름을 표시한다는 것입니다.디스플레이는 간단하지만 분명히 후드 태그 아래에서 비동기식으로 읽혀지고 표시될 "실제" 객체로 변환됩니다.

ReaderControl이 자체 스레드에서 실행되어야 한다고 생각하시나요? 제 생각에는 그래야 한다고 생각합니다.GUI가 수행하는 작업에 관계없이 태그를 계속 읽으려면 이 클래스를 자체 스레드로 패키징하려면 어떻게 해야 합니까?또한 이벤트를 처리할 때 TagTranslator가 번역을 처리하기 위해 스레드를 생성해야 하는 경우도 있다고 생각하시나요?

도움이 되었습니까?

해결책

이벤트를 사용하는 것보다 동시 대기열 데이터 구조와 다중 생산자, 단일 소비자 모델을 사용하는 것이 좋습니다.태그 판독기 스레드를 생산자로 생각하고 처리 스레드를 소비자로 생각하십시오.

스레드가 리더로부터 태그를 받으면 중복이나 기타 문제에 대해 걱정하지 않고 해당 태그를 대기열에 추가합니다.젠장, 그럴 수도 있지 원하다 어느 시점에서 정보가 중복됩니다.여기에 버릴 이유가 없습니다.

소비자는 대기열에서 기다리면서 항목을 꺼내어 한 번에 하나씩 처리합니다.

그만큼 BlockingCollection 수업은 이것에 딱 맞습니다.

// Shared queue.  Assuming that a tag is simply a string.
BlockingCollection<string> TagQueue = new BlockingCollection<string>();

// Tag reader threads (producers)
while (!ShutdownMessageReceived)
{
    string tag = GetTagFromReader(); // however that's done
    TagQueue.Add(tag);
}

// Processing thread (consumer)
while (!ShutdownMessageReceived)
{
    string tag = TagQueue.Take();
    // process the tag
}

BlockingCollection 여러 생산자와 소비자를 지원하므로 각각 원하는 만큼 가질 수 있습니다.그만큼 Take 메서드는 항목을 사용할 수 있을 때까지 차단됩니다.바쁘지 않은 대기이므로 폴링 오버헤드가 없습니다.

이런 종류의 일은 구현하기가 매우 쉽습니다. BlockingCollection, 매우 잘 수행되는 깨끗하고 간단한 코드를 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top