Esta función registra la función que se debe llamar cuando la hebra actual entra en un estado específico.
void cciRegisterForThreadStateChange( int *returnCode, CciThreadContext *threadContext, CciDataContext *userContext, CciRegCallback callback, CciCallbackType type);
El nodo de entrada para la hebra actual está sondeando activamente datos de la fuente de entrada, pero no hay datos disponibles. Los mensajes no se propagan por el flujo de mensajes hasta que no hay datos disponibles para el nodo de entrada.
El nodo de entrada para la hebra actual ha dejado de sondear datos y la hebra se ha liberado. El mismo nodo de entrada o cualquier otro nodo de entrada del mismo flujo de mensajes, vuelven a despachar la hebra. Se entra en este estado cuando se han utilizado instancias adicionales, que se han desplegado para un flujo de mensajes, para hacer frente a un flujo de datos de entrada que ahora ya ha cesado. El nodo de entrada sigue sondeando datos de entrada en una sola hebra y se liberan las hebras restantes.
La hebra actual está finalizando. Esto puede suceder cuando se cierra el intermediario, el proceso del grupo de ejecución finaliza de forma controlada, o cuando se suprime el flujo de mensajes. Puede ocurrir después de haber suprimido todos los nodos y analizadores del flujo.
De forma alternativa, el parámetro type puede ser el resultado de una operación OR a nivel de bit en dos o más de estos valores. En este caso, se llama a la función especificada cuando la hebra entra en el estado relevante para cada valor de type específico.
Ninguno. Si se produce un error, el parámetro returnCode indica la razón del mismo.
Declaración de la estructura y la función:
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; }
Coloque el código siguiente en la función _Switch_evaluate en los ejemplos para que pueda leer el rastreo de servicio y ver cuándo la hebra de proceso de mensaje cambia de estado:
/*registrar para cambio de estado de hebra */ 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; }
Este ejemplo sólo registra en la primera hebra que recibe un mensaje. Si es necesario registrar cada hebra que recibe un mensaje, las extensiones definidas por el usuario deben recordar en qué hebras se han registrado.
Al utilizar el parámetro userContext puede ver cómo los datos se pasan del código en el que está registrada la devolución de llamada a la función de devolución de llamada real.
Al registrar la devolución de llamada, se pasa un puntero a una instancia de la estructura MyContext. Este es el mismo puntero que se devuelve a la devolución de llamada. Para asegurar que el puntero todavía es válido cuando se devuelve a la devolución de llamada, una instancia de la estructura se declara como estática. Otra técnica para asegurar que el puntero es válido es asignar almacenamiento en el almacenamiento dinámico.
En la función de devolución de llamada, el parámetro userContext puede transformarse en un (MyContext*). Se puede hacer referencia a la estructura de MyContext original a través de esta dirección. Esto permite el paso de datos desde el código donde está registrada la devolución de llamada a la función de devolución de llamada.