2009-06-17 12 views
0

이 :이것은 무엇을 의미합니까?

typedef HRESULT (*PFN_HANDLE)(ClassName&); 

은 다음과 같이 사용되는 :

DWORD ClassName::Wait(PFN_HANDLE pfnh_foo) 
{ 
    while (!done) { 
    waitCode = WaitForMultipleObjects(paramA, paramB, paramC, paramD) 

    if (waitCode == WAIT_OBJECT_0) 
    { 
     pfnh_foo(*this); 
    } 
    else 
     done; 
    } 
    return waitCode; 
} 

그것은 그 기다립니다 표시가와 WaitForMultipleObjects에 도달하고이 이상한 pfnh_foo의 일을 한 후 후에 때 블록을 제외하고 아무것도하지 않고 하나가 루프 회귀 다시 기다리거나 종료 할

+2

'완료'에 대한 지정이 없습니까? –

+0

done은 사실이지만 코드 스 니프입니다. –

+0

pfnh_foo는 함수에 대한 포인터입니다. 따라서 Wait 함수의 행은 전달되는 함수를 호출합니다. –

답변

7

귀하의 wait() 기능은 기본적으로 waits for multiple objects 다음 function pointerPFN_HANDLE를 사용하여 함수를 호출 대기가 성공하면 (반환 값 WAIT_OBJECT_0으로 표시).

pfnh_foo(*this); 

이 인수는 * this 인수로 pfnh_foo가 가리키는 함수를 호출합니다.

HRESULT someFunction(ClassName& myClassInstance) 
{ 
//blah .. blah 
} 

기다립니다은 다음과 같이 호출됩니다 :

우리는 기능이 있다고 가정하자

PFN_HANDLE pfnh_foo = &someFunction; //function pointer to someFunction 
wait(pfnh_foo); 
+0

someFunction이 함수 포인터이므로 PFN_HANDLE pfnh_foo = someFunction; 기다림 (pfnh_foo); 또는 그냥 대기 (someFunction) –

+0

PFN_HANDLE pfnh_foo = & someFunction; PFN_HANDLE pfnh_foo = someFunction; 둘 다 괜찮아요 :) –

2

pfnh_foo는 함수 포인터 - 그것은 함수를 실행하는 것, 당신의 클래스를 매개 변수로를

+0

그래서 그냥 함수를 직접 호출하고 인수를 모두 대기를 제거 할 수 있습니다. 권리? –

+0

아니오 - Wait의 인수는 함수 포인터입니다. Wait에 대한 인수가 항상 동일한 함수 포인터가 아니라면, 필요합니다. –

+0

또는 reword : 예, 동일한 매개 변수로 Wait이 항상 호출되면 Wait에 인수를 제거 할 수 있습니다. Wait의 인수는 예상하는 함수의 서명을 알려주지 만 같은 서명을 가진 여러 함수를 가질 수 있습니다. Wait에 전달 된 함수가 하나 뿐인 것은 아닙니다. –

2

WAIT_OBJECT_0은 pfnh_foo를 실행하는 경우 대기중인 첫 번째 핸들이며 종료하는 다른 대기 핸들에 대해 실행합니다.

2

그것은 프로토 타입과 함수에 대한 함수 포인터를 정의 : 그것은 다음에 전달되는 기능을 복용하고 매개 변수로 현재 객체를 사용하여 부르고

HRESULT someFunction(ClassName &) 

.

2

pfnh_foo는 함수 포인터입니다. 일반 변수와 같은 함수를 사용할 수 있습니다.

HRESULT foo를 (클래스 이름 &)

2

이 스레드 동기화 코드이다

타입 정의의 HRESULT (* PFN_HANDLE) (클래스 이름 &)는 PFN_HANDLE는 서명의 함수 포인터가 있음을 의미한다.
는 클래스 이름처럼 나에게 보이는 : 대기는 별도의 스레드에서 실행하고이 상호 인 경쟁 조건

2

을 방지하기 위해 사용되고
콜백을 호출하기 전에 지정된 개체 중 하나가 무료하다는 신호를 기다리고 있습니다 exlcusion mechanism), 또는 자원을 놓고 경쟁하는 것 사이에서 협력하는 수단 ... 따라서 대상을 "기다리기"위한 필요성.

편집 : 위키피디아는 상호 배타에 대한 훌륭한 소개 자료를 제공하며 일부 근본적인 문제, 알고리즘 및 데이터 구조에 대해 설명합니다. 상호 배제 원칙에 익숙하지 않다면 읽을 가치가 있습니다.

http://en.wikipedia.org/wiki/Mutual_exclusion

0

그래서 난 그냥 함수 포인터를 제거 할 수 있고 그 시점에서 함수를 직접 호출합니다.Wait()에서 WaitforMulitpleObject가 반환 될 때 어떤 객체가 사인 되어도 처리해야하는 함수가 두 개 이상있는 경우에만 함수 포인터를 사용하는 것이 좋습니다.

즉.

HRESULT Foo(ClassName& myClass); 
HRESULT Bar(ClassName& myClass); 

anotherFunction(...) 
{ 
    Wait(Foo); 
    Wiat(Bar); 
} 
+0

예, 맞습니다. –

관련 문제