cciRegisterForThreadStateChange

이 함수는 현재 스레드가 특정 상태가 될 때 호출할 함수를 등록합니다.

구문

void cciRegisterForThreadStateChange(
          int               *returnCode,
          CciThreadContext  *threadContext,
          CciDataContext    *userContext,
          CciRegCallback     callback,
          CciCallbackType    type);

매개변수

returnCode
함수의 리턴 코드(출력). 입력이 널(NULL)인 경우 출력은 오류가 브로커에 의해 자동 처리되거나 무시된다는 것을 의미합니다. 입력이 널(NULL)이 아닌 경우 출력은 호출이 성공했음을 의미합니다. threadContext 매개변수가 올바르지 않으면 *returnCode가 CCI_INV_THREAD_CONTEXT로 설정되고 콜백이 등록되지 않습니다.
threadContext
콜백 함수 및 연관된 데이터를 등록할 스레드 컨텍스트를 제공합니다. 이 매개변수는 현재 스레드에서 cniGetThreadContext() API를 사용하여 확보할 수 있는 것으로 간주됩니다. threadContext로서 널(NULL)이 제공되면 스레드 컨텍스트는 프레임워크에 의해 판별됩니다. 이는 cniGetThreadContext를 호출하는 것보다 효과가 떨어집니다.
userContext
호출자는 콜백 함수가 호출될 때 이 함수로 전달되는 컨텍스트 포인터를 제공할 수 있습니다. 이 매개변수는 널(NULL)이 될 수 있습니다.
callback
호출할 콜백 함수의 포인터입니다. 이 함수는 CciRegCallback 유형이어야 합니다.
type
스레드가 종료 중이거나 스레드가 비활동 상태 중 하나일 때 콜백을 호출할 것인지 여부를 지정합니다. 비활동 상태는 다음 값 중 하나가 될 수 있습니다.
  • CCI_THREAD_STATE_IDLE:

    현재 스레드의 입력 노드가 입력 소스의 데이터를 폴링하는 중이지만 사용 가능한 데이터가 없습니다. 입력 노드에서 데이터를 사용할 수 있을 때까지 메시지가 메시지 플로우로 전달되지 않습니다.

  • CCI_THREAD_STATE_INSTANCE_END

    현재 스레드의 입력 노드가 데이터 폴링을 정지했으며 스레드가 릴리스되었습니다. 같은 입력 노드 또는 같은 메시지 플로우의 다른 입력 노드에 의해 스레드가 다시 디스패치됩니다. 이러한 상태는 메시지 플로우에 전개된 추가 인스턴스를 사용하여 현재 중단된 입력 데이터의 유입을 처리할 때 발생합니다. 입력 노드는 단일 스레드에서 계속 입력 데이터를 폴링하며 다른 스레드는 릴리스됩니다.

  • CCI_THREAD_STATE_TERMINATION

    현재 스레드가 종료 중입니다. 이러한 경우는 브로커가 종료하거나 실행 그룹 프로세스가 제어된 방법으로 종료하거나 메시지 플로우가 삭제 중일 때 발생할 수 있습니다. 플로우의 모든 노드와 구문 분석기가 삭제된 후에도 발생할 수 있습니다.

또한 type 매개변수는 이들 값 중 둘 이상에 대한 비트 단위 OR 연산의 결과일 수 있습니다. 이러한 경우 지정된 함수는 스레드가 각 type 값에서 관련된 상태가 될 때 호출됩니다.

리턴 값

없음. 오류가 발생할 경우, returnCode 매개변수는 오류의 이유를 표시합니다.

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는 이 주소로 참조할 수 있습니다. 그렇게 하면 콜백이 콜백 함수에 등록된 코드에서 데이터를 전달할 수 있습니다.

주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
as24630_