2011-10-24 2 views
0

나는 다음과 같은 구조를 가진 C++ 응용 프로그램이 있습니다C++ 멀티 스레딩 및 이벤트

등급 AAA : 일부 기능 및 스레드를 엽니 다 그들 중 하나 개 기능이 있습니다. 클래스 BBB : 일부 함수가 있고 그 중 하나가 스레드를 여는 함수입니다. 클래스 CCC : 함수에서 내부적으로 모두 트레드를 여는 AAA 및 BBB를 호출합니다.

어떤 경우 AAA 스레드에서 나는 트레드를 나가서 BBB와 CCC에 모두 알리고 싶은 것을 알고 있습니다. 스레드 (Win32Thread)에 있기 때문에 스레드에서 실행중인 void 함수이므로 CCC에 값을 반환 할 수 없습니다.

저는 C++을 처음 접했고 (C# 영역에서 가져옴) 어떻게해야 할 지 모릅니다. (알림) 참고 :이 구조를 변경할 수 없습니다. 클래스의 기능을 약간만 변경하거나 추가 할 수 있습니다. 트레드와 대형 코드를 실행하는 것은 큰 프로세스입니다.

아이디어가 있으십니까? 가능하다면 더러운 것이 아닙니다. :)

샘플을 추가하면 도움이 될 것입니다.

답변

0

너무 많은 문제를 이해하지 못하고 너무 일반적입니다. 그리고 어떤 종류의 멀티 스레딩 라이브러리를 사용하고 있는지 지정하지 않았습니다.

스레드간에 메시지를 보내려면 대기 핸들, 잠금 및 세마포를 사용하여 메시지 큐를 동기화해야합니다.

물론 스레드간에 메시지를 보내려면 안전한 다중 스레딩 큐가 필요합니다.

한가지 가능한 해결책 :

는 예를 들어 대기 이벤트를 통해 유휴 상태 인 경우에 깨어 스레드 B 큐로을가 대기 상태에서 B 스레드에 메시지를 송신 할 필요 스레드 경우

. 스레드 B가 메시지를 받고 대기열에서 다른 메시지를 게시하는 응답을 보냅니다.

다른 가능한 해결책 :

스레드 B가 스레드로 메시지를 전송하고 응답이 수신되지 않을 때까지 스레드 A를 차단하는 응답을해야 할 필요. 스레드 A가 스레드 B 대기열에 메시지를 대기열에 추가하면 메시지 개체가 함수 스택에있을 수 있습니다. 그런 다음 스레드는 유휴 상태에있는 스레드 B를 깨우고 대기 핸들 또는 세마포를 통해 대기 상태로 들어갑니다. 스레드 B는 메시지를 대기열에서 제외 할 때 스레드 A가 보낸 개체에 응답을 기록하고 스레드 A를 대기 상태에서 깨 웁니다. 개체 필드는 두 스레드가 읽기 \ 쓰기를 위해 액세스하기 때문에 휘발성으로 표시되어야합니다. 그러면 스레드 A는 메시지 객체에 저장된 값을 사용하고 스택에서 객체를 삭제합니다.

소리가 복잡하게 들리지만 구현이 간단합니다.

Windows OS를 사용하는 경우 각 스레드마다 하나씩 보이지 않는 메시지 창을 만드는 Windows 메시지 대기열을 사용할 수 있습니다. 첫 번째 경우에는 PostMessage를 사용하고 두 번째 경우에는 SendMessage를 사용하십시오.

0

Windows 전용 솔루션을 두려워하지 않는 경우 BBB 스레드에서 PeekMessage()으로 전화하십시오. 이렇게하면 Windows 메시지 대기열이 만들어집니다. (주 스레드는 이미 하나씩 가지고 있습니다).이제 SendMessage()을 사용하여 AAA에서 다른 스레드로 메시지를 보낼 수 있습니다. 클래스가 아니라 쓰레드로 전송한다는 점에 유의하십시오. GetMessage()으로 전화하면 메시지가 표시됩니다.

0

스레드에 사용되는 일반적인 디자인은 스레드를 포함하는 클래스의 인스턴스 (해당 스레드의 인스턴스 변수도 포함 함)를 전달하는 스레드 함수입니다. 이게 너 때문 이니? 스레드가 전달 된 클래스의 인스턴스가 있습니까? 만약 그렇다면, 바깥쪽에있는 것들을 추적하고 멈출 때를 나타내는 BOOL 속성을 넣으십시오. 스레드의 기본 루프에서 플래그를 확인하여 다시 돌아 다니는 비즈니스가 있는지 확인하십시오. 이것은 스레드를 종료하는 유일한 방법입니다.