2012-10-23 6 views
0

직렬로 명령을 보내고 명령을 기반으로 응답을 받고받은 메시지를 기반으로 작업을 수행해야합니다. 콜백은 비동기 작업이므로 사용해야한다고 들었습니다.비동기 통신

메시지를 보낼 수있는 스레드와 메시지를받는 스레드가 2 개 있습니다.

예 :

//Thread 1 
sendMessage("Initialize"); 

//Thread 2 
while(1) 
{ 
    checkForMessages(); 
} 

내가 특정 메시지에 대한 초기화 받았다 메시지를 처리하는 함수를 작성하는 방법에 대해 설명합니다.

예 :

CommHandle(Command,MsgReceived) 
{ 
    if(command) 
    { 
    if(MsgReceived == ok) 
    ... 
    if(MsgReceived == error) 
    ... 
    } 

}

+1

플랫폼에 대한 선호? – WhozCraig

+0

Windows이지만 플랫폼에 독립적이어야합니다. – dare2k

+0

기본 Windows를 사용하면 플랫폼 독립적 인 직렬 통신을 수행하지 못할 수도 있습니다. cygwin을 사용해야한다고 가정합니다.지금은 windows가 – alk

답변

1

나는이 비동기 작업이기 때문에 콜백을 사용할 필요가 있다고 들었다.

반드시 그렇지는 않습니다. Windows에는 "비동기 I/O"라는 것이 있습니다. 이는 "중복 된 I/O"(explanation here)와 동의어 인 내부 Windows 용어로 간주됩니다. 중첩 된 I/O를 사용하는 경우 전송이 완료되면 콜백을 받게됩니다. 이것은 CPU 부하를 줄이므로 좋지만, 기다리는 동안 프로그램이 더 잘할 수 없다면 실제로는 필요하지 않습니다. 따라서 응용 프로그램의 특성에 따라 다릅니다.

응용 프로그램의 특성에 관계없이 스레드를 통한 모든 직렬 통신을 처리해야하므로 주 GUI 스레드가 당혹스럽지 않게 고정되지 않습니다.

하나의 rx 및 하나의 tx 스레드를 사용하면 딜레마가 발생합니다. 동일한 포트 핸들을 사용하고 있고 스레드로부터 안전하지 않으므로 자유롭게 액세스 할 수 없습니다. 해결책은 모든 전송을 처리하는 하나의 단일 수퍼 스레드를 만들거나 뮤텍스를 통해 포트 핸들을 보호하는 것입니다.

어떤 방법이 가장 좋을지 모르겠지만 권장 사항이 없습니다. 나는 오직 하나의 "수퍼 스레드"를 사용했다. 하나의 명백한 장점은 "스레드 죽이기", "포트가 열려있다", "포트가 닫혀있다"와 같은 WaitFor 명령어를 한 곳에서 집중화 할 수 있다는 것이었다. 그러나 동시에 코드는 다소 복잡해졌습니다.

특정 메시지에 대해 초기화 된 함수를 작성하고 수신 된 메시지를 처리 ​​할 수 ​​있습니까?

스레드가 수신 한 데이터를 일부 버퍼로 삽화하게하십시오. tx 버퍼와 rx 버퍼. 직렬 프로토콜 및 성능에 따라 이중 버퍼를 사용해야 할 수도 있습니다. 이중 버퍼는 현재 전송에 사용되는 버퍼와 가장 최근에 수신 된 데이터를 포함하는 버퍼입니다.

그런 다음 main에서 버퍼의 데이터를 가져옵니다. 스레드로부터 안전해야합니다. 일단 당신이 그것을 멀리 얻은, 당신은 어떤 형태의 데이터와 함께 파서를 작성하고 거기에서 조치를 취하십시오

+0

감사합니다. 수퍼 스레드 제안을 통해 가능한 해결책을 찾았습니다. – dare2k