Passaggio/estrazione dei parametri
La classe CLB_thread contiene un insieme di funzioni per trasferire parametri al thread in esecuzione; In questo articolo i termini argomento e parametro identificano lo stesso oggetto, cioè un generico valore passato ad una funzione per la sua esecuzione. Per mantenere la genericità della funzione, i parametri sono passati al thread in modo molto simile alla sequenza di comandi utilizzata per CLB_messenger (vedi questo articolo e quest’altro) utilizzando la funzione Set_argument_list(..) che trasmette una lista variadic di valori __arg_value.
Un altro metodo di passare i parametri è quello di usare la funzione Push_argument(..) che permette il trasferimento sequenziale di un numero qualunque di parametri alla classe CLB_thread.
Il thread in esecuzione lanciato con la funzione Start() viene definito attraverso delle macro di CLB_lang e, fra queste, una macro, la __thr_pop_p(..) permette l’estrazione sequenziale dei parametri.
Nota: il tipo di parametri e la loro sequenza devono essere identici in ingresso ed estrazione degli stessi; i parametri, come si osserva, sono sempre di tipo __arg_value (cioè void *), mentre la funzione thread li convertirà nel tipo atteso mediante la macro __thr_pop_p.
bool Set_argument_list(__arg_value pars, …)
La funzione permette di trasferire in un solo comando la sequenza dei parametri necessari al thread. Ad esempio, il thread che calcola una variante colore è inizializzato in questo modo:
... ... THREAD_CALC_CWY *thr= new THREAD_CALC_CWY; thr->SetCalculationModel(_$str->ovl_model); thr->Set_argument_list ( _$str->SPT, // spettri tagli dei colori sui quadri tbl, // tabella delle concentrazioni &_$str->nchn, // numero di quadri presenti CHNCOL, // lista dei colori canale (per ricavare l'ordine di stampa dei quadri) CRGB, // tabella rgb da inizializzare _$str->visibility, // vettore delle visibilità canali (ref_tbl ? CREF : 0),// calcola la tabella delle riflettanze &_$str->ovl_model, // modello calcolo sovrapposizioni coverage, // vettore coprenze coloi canali &model, // modello gray, dithering etc (_$str->background.IsVisible() ? _$str->background.GetColor(): 0), // uso del millepunti, se definito _$end ); ... ...
Importante: L’ultimo argomento passato alla funzione è la macro _$end,
bool Push_argument(__arg_value arg)
Immette un argomento nella lista di quelli necessari all’esecuzione del thread; La sequenza degli inserimenti mediante questa funzione sarà ovviamente identica a quella definita attraverso la Set_argument_list . due metodi sono equivalenti, la scelta del metodo utilizzato è generalmente in funzione della chiarezza espositiva nella scrittura del programma.
ARGPTR *Get_argument_list()
La funzione rimanda la lista ordinata degli argomenti inseriti con le due funzioni precedenti. La Get_argument_list() è utilizzata per lo più dalle macro di definizione del thread, pertanto non c’è alcuna necessità di un uso diretto.
__arg_value Pop_argument()
Inserisce sequenzialmente un parametro nella lista di quelli trasferiti al CLB_thread; è usata internamente dalla macro __thr_push_p usata nel corpo della macro che alloca i thread, che sarà descritta fra poco. pertanto non c’è alcuna necessità di un uso diretto.
__arg_value Push_argument()
Estrae sequenzialmente un parametro dalla lista di quelli trasferiti al CLB_thread; è usata internamente alla macro __thr_pop richiamata nel corpo della funzione thread, che sarà descritta fra poco. pertanto non c’è alcuna necessità di un uso diretto.