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.

Pages: 1 2 3 4 5 6 7 8
Skip to toolbar