Questa funzione registra una funzione da richiamare quando il thread attuale assume un determinato stato.
void cciRegisterForThreadStateChange( int *returnCode, CciThreadContext *threadContext, CciDataContext *userContext, CciRegCallback callback, CciCallbackType type);
Il nodo di input per il thread attuale esegue attivamente il polling dei dati dall'origine di input, ma non è disponibile alcun dato. Finché il nodo di input non dispone dei dati, i messaggi non vengono trasmessi nel relativo flusso.
Il nodo di input per il thread attuale ha interrotto il polling dei dati e il thread è stato rilasciato. Il thread viene inviato di nuovo mediante lo stesso nodo di input o mediante un altro nodo di input nello stesso flusso di messaggi. Questo stato viene assunto quando sono state utilizzate istanze aggiuntive, che sono state inviate per un flusso di messaggi, per far fronte ad un afflusso di dati di input che ora è cessato. Il nodo di input continua a richiedere dati di input su un unico thread e gli altri thread vengono rilasciati.
Il thread attuale è in fase di chiusura. Ciò può accadere quando il broker è chiuso, l'elaborazione del gruppo di esecuzione si sta concludendo in modo controllato o quando il flusso di messaggi viene eliminato. Ciò può verificarsi dopo che tutti i nodi ed i programmi di analisi nel flusso vengono eliminati.
In alternativa, il parametro type può essere il risultato di un'operazione OR a livello di bit su due o più di questi valori. In tale caso, la funzione specificata viene richiamata quando il thread assume lo stato relativo a ciascun singolo valore type.
Nessuno. Se si verifica un errore, il parametro returnCode indica il motivo dell'errore.
Dichiarazione di struct e funzione:
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; }
Inserire il seguente codice nella funzione _Switch_evaluate negli esempi per abilitare la lettura della traccia del servizio e per vedere quando il thread di elaborazione del messaggio cambia stato:
/*registro del cambiamento di stato del thread*/ 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; }
In questo esempio viene registrato solo il primo thread che riceve un messaggio. Se è necessario registrare tutti i thread che ricevono un messaggio, è necessario che le estensioni definite dall'utente ricordino i thread sui quali sono registrate.
Mediante l'uso del parametro userContext è possibile vedere come i dati vengono passati dal codice dove è registrata la funzione callback alla funzione callback attuale.
Quando si registra la callback, viene passato un puntatore ad un'istanza dello struct MyContext. Questo è lo stesso puntatore così come ripassato alla funzione callback. Per accertarsi che il puntatore sia ancora valido quando viene ripassato alla callback, un'istanza dello struct viene dichiarata come statica. Un altro modo per accertarsi che il puntatore sia valido è quello di assegnare memoria sull'heap.
Nella funzione callback, il parametro userContext può essere impostato su un (MyContext*). E' possibile fare riferimento allo struct MyContext di origine mediante questo indirizzo. Ciò consente il passaggio dei dati dal codice in cui la callback è registrata nella funzione callback.