2010-01-19 7 views
6

다음은 문제입니다. 직렬로 장치로 보내고받을 수 있어야합니다. 이것은 멀티 스레드 방식으로 수행되어야합니다. 다음과 같은 흐름은 다음과 같습니다 장치에 대한생산자/소비자가 연속적으로 장치를 사용하는 경우

  1. 기다립니다 내게 뭔가를 보내 - 장치 나에게 무언가, 프로세스 메시지를 보내는 경우 또는 유휴 경우, 다음 장치와 온라인 있는지 확인하기 위해 상태를 조회

  2. , 인정 필요에 따라 다른 명령을 수행하도록 장치에 지시하십시오.

지금은 수신 스레드와 전송 스레드가 있습니다. 수신 스레드에는 1 바이트 동안 ReadFile (...)을 통해 직렬 포트를 계속 점검하는 while 루프가 있습니다. 바이트가있는 경우 버퍼를 작성한 다음 데이터를 구문 분석하여 나에게 전송 된 데이터를 확인합니다.

송신 스레드는 읽기 스레드에 의해 정의 된 다음 명령을 취해 WriteFile을 통해 동일한 COM 포트로 보냅니다. 핵심은 자신과 장치 사이에 수신/전송 관계가 있다는 것입니다.

내 질문은 여기에 중첩 된 생산자/소비자 모델이 있습니까? 수신 스레드가 장치에서 소비되고 송신 스레드가 장치로 생성되는 경우 스레드는 본질적으로 말을해야 동기화됩니다. 맞습니까? 내 노력을 효율적으로 동기화하고 장치와 빠르게 대화하는 가장 좋은 방법은 무엇입니까? 참고 : TThreads가 있고 중요한 섹션과 뮤텍스를 사용할 수있는 C++ Builder 5를 사용하고 있습니다.

편집 : 폴링을 사용하고 있기 때문에 더 잘 작동한다면 WaitCommEvent도 사용할 수 있습니다.

답변

1

공유 할 리소스가 무엇이라고 생각하십니까?

두 스레드 사이에 대기열과 같은 것이 있으면 꽤 고전적인 생산자/소비자 모델입니다. E.G. 다른 스레드가 큐에서 추출하는 동안 하나의 스레드를 읽은 다음 명령을 큐에 넣으면 명령을 처리하고 장치에 기록한 다음 해당 큐에 대한 액세스를 뮤텍스 또는 세마포와 동기화해야합니다.

아마도 내가 누락되었지만 큐에서 읽는 다중 스레드가 있고 전송해야하는 명령이 순서대로 있어야하는 경우에만 복잡해집니다. 그래서 간단하게 유지하십시오.

+0

그렇지만 읽는 중 장치가 쓰여지지 않도록 장치에 대한 액세스를 어떻게 동기화합니까? 글로벌 플래그? –

+0

그렇게해야한다는 것이 확실합니까? 그렇다면 세마포어를 사용하여 읽기/쓰기 작업을 동기화 할 수 있습니다. 이 http://stackoverflow.com/questions/1488712/is-it-safe-to-read-and-write-to-a-serial-port-at-the-same-time-via- 다를 수 있습니다. 도움이됩니다. – Duck

관련 문제