Delphi TThread Synchronization
Come eseguire un metodo all’interno di un TThread in modo sincrono con il Thread principale dell’applicazione è abbastanza semplice.
Supponiamo di voler syncronizzare l’accesso ad una variabile di conteggio, possiamo usare i metodi TThread.Synchronize e TThread.Queue.
Il metodo TThread.Syncronize esegue immediatamente il metodo interrompendo immediatamente l’esecuzione del Thread principale mente il metodo TThread.Queue dovrebbe fare una cosa più soft gestendo una coda di metodi in esecuzione.
Bisogna però prestare attenzione se si utilizzano TThread.Syncronize e TThread.Queue all’interno di una applicazione di tipo console “” e introdurre un loop con la chiamata al metodo CheckSynchronize(100) per dire al Thread principale di eseguire i metodi in coda.
Il metodo CheckSynchronize(100) è presente nella unit System.Classes che deve essere inclusa nel progetto.
1 2 3 4 5 6 7 8 9 10 |
while not Termina do begin try CheckSynchronize(100); // sleep(1000); except on e: exception do WriteLn(e.ClassName, ': ', e.Message); end; end; |
Esiste inoltre una variabile di ambiente, “WakeMainThread” di tipo “TNotifyEvent” che può essere usata allo scopo di gestire il loop di CheckSynchronize.
Indiscutibilmente prediligo l’utilizzo di TCriticalSection con i lock per gestire i metodi dei thread da sincare, ma quando dobbiamo importare tonnellate di librerie in un applicazione console, non si sa mai che ci sia qulche TThread.synchronize nascosto chissà dove pronto a non funzionare :-).