콜백으로 등록될 수 있고 등록된 이벤트가 발생할 때 호출되는 함수입니다. 함수는 다음 TypeDef와 일치하는 함수 포인터를 제공하여 등록됩니다.
type CciRegCallbackStatus(BipCci.h에 정의됨)
이러한 5개의 추적 유틸리티 함수에서 CciObject 매개변수는 널(NULL)이어야 합니다.
다음 struct 및 함수 선언
typedef struct { int id; }MyContext; static int registered=0; CciRegCallbackStatus switchThreadStateChange(CciDataContext *context, CciCallbackType type) { char traceText[256]; char* typeStr=0; MyContext* myContext = (MyContext*)context; if (type==CCI_THREAD_STATE_IDLE){ typeStr = "idle"; }else if(type==CCI_THREAD_STATE_INSTANCE_END){ typeStr = "instance end"; }else if (type==CCI_THREAD_STATE_TERMINATION){ typeStr = "termination"; }else{ typeStr = "unknown"; } memset(traceText,0,256); sprintf(traceText,"switchThreadStateChange: context id = %d, thread state %s",myContext->id,typeStr); cciServiceTrace(NULL, NULL, traceText); return CCI_THREAD_STATE_REGISTRATION_RETAIN; }
서비스 추적을 읽을 수 있고 메시지가 스레드 변경 상태를 언제 처리하는지 알 수 있는 샘플에서 다음 코드를 _Switch_evaluate 함수에 넣으십시오.
/*register for thread state change*/ CciMessageContext* messageContext = cniGetMessageContext(NULL,message); CciThreadContext* threadContext = cniGetThreadContext(NULL,messageContext); static MyContext myContext={1}; if(registered==0){ cciRegisterForThreadStateChange( NULL, threadContext, & myContext, switchThreadStateChange, CCI_THREAD_STATE_IDLE | CCI_THREAD_STATE_INSTANCE_END | CCI_THREAD_STATE_TERMINATION); registered=1; }
이 예에서는 메시지를 수신한 첫 번째 스레드만 등록합니다. 메시지를 수신한 모든 스레드를 등록해야 되는 경우 사용자 정의 확장은 등록된 스레드를 기억해야 합니다.
userContext 매개변수를 사용하면 콜백이 실제 콜백 함수에 등록된 코드에서 데이터가 전달되는 방법을 알 수 있습니다.
콜백을 등록할 때 MyContext struct 인스턴스의 포인터가 전달됩니다. 이 포인터는 콜백으로 다시 전달되는 포인터와 같습니다. 포인터가 콜백으로 다시 전달될 때에도 유효한지 확인하기 위해 struct의 인스턴스가 정적으로 선언됩니다. 포인터가 유효한지 확인하는 또 다른 기술은 힙(heap)에서 저장영역을 할당하는 것입니다.
콜백 함수에서 userContext 매개변수는 (MyContext*)로 캐스트됩니다. 원래의 MyContext struct는 이 주소로 참조할 수 있습니다. 그렇게 하면 콜백이 콜백 함수에 등록된 코드에서 데이터를 전달할 수 있습니다.