utilizzare il risultato dei thread

Il codice di esempio fino a qui descritto, apparentemente non svolge alcuna  azione dopo il lancio del gruppo di thread; e  potrebbe essere una delle possibilità: un programma lancia uno o più thread che si concludono (o rimangono in standby  fino a nuovi ordini) disinteressandosi del ricultato.

E’ il caso ad esempio dei thread di stampa (TSK_SCREEN_RENDER)  eseguiti attraverso le classe RENDERING_ENGINE: questi thread possono essere sospesi o cancellati, ma non è necessario attendere la fine della loro esecuzione.

Nell’esempio fin qui mostrato invece la logica del programma richiedeva che fosse attesa la terminazione dei thread, per eseguire altre operazioni; ricordiamo che  abbiamo usato la classe CLB_thread_list, che ha lanciato un insieme di thread figli (uno per canale graytone)  assegnati attraverso la funzione CLB_thread_list::Start() posta alla fine della funzione CREATE_DITHERING . Di seguito evidenziamo, nella funzione, solo l’istruzione finale, Start() dell’ istanza CLB_thread_list usata.

	bool CREATE_DITHERING(CLASS_STR)
	{
             ..... 
             ......
	    _$str->threads->UseDisplayProgressWindow(__translate("Create Screens channels"), __translate(" Wait: the program is building dithered channels.."));
	     return _$str->threads->Start();
	}

La funzione CLB_thread_list ::Start(..) lancia al suo interno i threads figli assegnati, quindi lancia un thread interno che semplicemente rimane in attesa della terminazione degli stessi. In questa attesa intercetta lo stato di esecuzione percentuale dei tread assegnati, e lo visualizza nella finestra modale definita dall’istruzione _$str->threads->UseDisplayProgressWindow(..) nella funzione CREATE_DITHERING.

Lo stato di esecuzione è automaticamente visualizzato in questa finestra modale:

La finestra è aggiornata fino a chiusura regolare di tutti i thread o loro interruzione con il tasto Exit.

Notare i messaggi in alto nella finestra: sono quelli definiti con la  funzione

_$str->threads->UseDisplayProgressWindow(…)

La finestra indica il numero di thread ancora attivi, tempo passato e rimanente e % complessiva del lavoro svolto.

La CLB_thread_list ::Start(..)  infine chiude l a finestra e  rimanda true se i thread sono tutti terminati correttamente: in questo caso il passaggio successivo sarà di mostrare il risultato..

 

 


In conclusione:

 Abbiamo, in questo lungo articolo, discusso le funzionalità di un insieme di classi usate per la gestione dei thread nel framework di Colibrì. Non abbiamo esaurito l’argomento, poiché esistono altre classi che sono utilizzate per eseguire i thread, e non abbiamo spiegato tutte le  macro di CLB_lang a disposizione per gestire il flusso dei thread; in un prossimo articolo discuteremo anche altre classi utilizzabili per queste funzioni; in particolare affronteremo l’argomento relativo all’uso delle  CLB_thread  in programmazione concorrente, dove i thread scambiano dati e  comunicano fra di loro utilizzando oltre che gli eventi i mutex.


 

 

Pages: 1 2 3 4 5 6 7 8

Leave a Reply

Skip to toolbar