2011-03-23 5 views
2

나는 오래 전에 작성한 일부 코드를 다시 작성합니다. 코드는 다른 작업자 스레드를 AfxBeginThread으로 시작하는 클래스입니다. 스레드가 끝나면 호출 클래스에 작업을 반환해야합니다.다른 스레드에서 비 정적 클래스 함수 호출

실제로 스레드가 종료되면 PostMessage에 의해 메시지를 보내고 호출 된 클래스에 결과를 보냅니다. 하지만이 방법은 실제로 MFC에 의존하며,이 작업을 수행하려면 모든 클래스가 모든 MFC 항목을 구현해야합니다.

메시지를 보내는 대신이 클래스의 비 정적 메서드를 직접 호출하면 올바른지 여부?

답변

3

메서드를 직접 호출하는 대신 (자체적으로 새로운 스레딩 문제 집합을 소개 함) 동일한 함수의 MFC 구현 대신 기본 Win32 ::PostMessage()을 사용해보십시오. 모든 스레드는 ::PostMessage()을 호출하여 메시지를 다른 스레드에 안전하게 전달할 수 있습니다.

+0

그리고이 메시지를 어떻게 받아 들여야합니까? 내 클래스는 MFC에서 파생되지 않습니다. – bratao

+0

@ bratao : Windows 프로그램의 정상적인 메시지 루프가 있습니다 (제 생각 엔). – Xeo

+0

MFC 함수 인'AfxBeginThread'로 스레드를 시작한다고하셨습니다. 어쨌든, Xeo는 맞습니다. 메시지 루프에 들어오는 일반 메시지 일뿐입니다 (MFC가 아닌). –

0

윈도우 메시징 프리미티브가 아닌 일반 스레딩 프리미티브를 사용하려는 것처럼 들립니다.

어떤 버전의 AfxBeginThread을 사용하고 있습니까? 클래스 인스턴스를 전달하면 완료된 실행을 알게되면 해당 클래스의 멤버에 직접 액세스 할 수 있습니다. 함수 포인터를 전달하면 lParam 매개 변수로 모든 클래스 포인터를 전달한 다음이를 통신 컨텍스트로 사용할 수 있습니다.

클래스에 액세스 할 때 스레드로부터 안전하게 수행하기를 원할뿐입니다. 실이 끝날 때까지 기다리면 괜찮을 것입니다. 그렇지 않으면 중요한 섹션이나 뮤텍스를 사용할 수 있습니다. 자세한 내용은 MSDN article on thread synchronization primitives을 참조하십시오.

+0

이 수업에 들어간 후에는 그림과 그리기를 포함한 많은 일들을 할 것입니다. 다른 스레드에서 클래스 함수를 호출하면 주 스레드로 돌아 가지 않지만 두 스레드가 일을 유지하게됩니다. 이는 매우 위험합니다. 내 클래스를 CWnd 기반 클래스로 변환하도록 선택했다.이 방법은 메시지 맵에 액세스 할 수 있으므로 코드가 실제로 단순화된다. – bratao

관련 문제