2010-01-19 2 views
2

디자인 문제가 있습니다. SENDING 및 RECEIVING에 대해 별도의 클래스를 정의하는 것이 더 낫습니다. 아니면 하나의 Thread 클래스를 정의하는 것이 더 나은가? 뮤텍스에 의해 잠길 수있는 큐를 공유하는 것이 더 쉽기 때문에 나는 하나의 Thread 클래스에 대한 아이디어를 좋아한다.설계 스레드 등급

디자인 옵션 # 1 (별도) :

mySendThread = new SendThread(); // Have thread properties and separate members 

myRcvThread = new RcvThread(); // Have thread properties and separate members 

디자인 옵션 # 2 (마스터) :

마스터 스레드 - I가 통신하는 스레드를 설계 한

Execute() 
{ 
    if (threadType == RCV_THREAD) 
    { 
     globalVar = new MasterThread(serialPortHandle); 
    } 
    while (!Terminated) 
    { 
     if (threadType == RCV_THREAD) 
     { 
      if(globalVar) 
      { 
       // do work 
      } 
     } 
     if (threadType == SND_THREAD) 
     { 
      tCountSnd = GetTickCount()/SND_THREAD_DELAY; 
      if (tCountSnd != tCountSnd2) { 
       tCountSnd2 = tCountSnd; 
       if (globalVar) { 
        // do sending work 
       } 
      } 
     } 
    } 
} 
+0

부스트와 같은 기존 스레드 클래스의 문제점은 무엇입니까? – jalf

+0

아무 것도. 스레드 클래스를 설계하지 오전 .. 구현을 설계 오전 –

답변

3

직렬 포트 (파이썬에서는 C++이 아니지만별로 중요하지 않습니다)는 다음과 같습니다 :

읽기 및 대기열 2 개 - 전송 용 및 수신 메시지 용. 스레드는 항상 직렬 포트 (수신 데이터 용)와 송신 대기열 (응용 프로그램이 전송하도록 요청한 내용을 전송) 모두에서 (비동기 적으로) 수신합니다. 데이터가 시리얼 포트에 도착하면 응용 프로그램이 송신 큐에 데이터를 배치하는 경우,이 응용 프로그램의 사용

  • 에 대한 수신 큐에 배치됩니다

    1. 이 스레드는 직렬 포트를 아래로 전송

    단일 리소스 (직렬 포트)가 단일 스레드에 의해 유지되고 두 개가 공유하지 않기 때문에이 디자인이 더 적합합니다. 대기열에서 읽기/쓰기 및 직렬 포트에서 읽기/쓰기가 간단한 작업 (자연스럽게 직렬 포트는 편리한 클래스로 포장되어 있기 때문에 여러 클래스로 나누는 것은 나에게 잔인한 소리처럼 들립니다 .- 실제로 this class을 추천합니다. Ramon De Klein)

    아, 아주 잘 작동합니다.

  • +0

    대기열 대기열은 응용 프로그램과 프로세스/보내는 스레드간에 공유하는 글로벌 대기열입니까? –

    +0

    동기화 된 대기열 개체입니다. C++에서 사용하는 스레딩/동기화 라이브러리에 따라 달라집니다. –

    +0

    메시지 처리 중 수신이 차단되거나이 대기열이 작업자 스레드로 전달되는 것을 차단하는 방법은 무엇입니까? –

    1

    공유 할 큐에 관해서는 별도의 클래스로 랩핑하고 뮤텍스 처리를 구현하십시오. 모든 스레드 클래스는 큐 래퍼에 대한 참조를 보유하고 있으므로 뮤텍스를 전혀 처리 할 필요가 없습니다.

    4

    사용하려는 실제 스레드 추상화에서 스레드의 목적이나 실행을 완전히 분리하는 것이 더 좋습니다.

    스레드 클래스를 단순한 래퍼로 만들어 스레드를 시작, 중지 및 결합 할 수 있습니다. 실제 실행을 위해 생성자에서 펑터 객체 (또는 함수 포인터)를 가져옵니다.

    더 나은 방법은 이미 사용 가능한 많은 스레드 추상화 중 하나를 사용하는 것입니다. 하나는 boost :: thread를 쓰는 대신 이미 사용중인 모든 프레임 워크에 이미 스레드 클래스가 있습니다.

    +1

    +1. – avakar

    0

    두 번째 선택은 분명히 나쁜 것입니다. 2 개의 다른 클래스를 갖는 것이 더 좋으며 어쩌면 공통 구현을 가진 기본 클래스를 가질 수 있습니다. 이것은 초기 평가 일 뿐이므로 문제에 대한 자세한 정보를 제공하십시오. 그러면 문제의 좋은 분석을 수행 할 수 있습니다.