Allora, la soluzione così al volo non ce l'ho, però posso darti qualche suggerimento:
Questa variabile "esegui" non ti serve. La usi esattamente per fare quello per cui la proprietà Terminated è preposta.codice:esegui:=true;
Il controllo del while fallo sulla proprietà Terminated. Poi non capisco una cosa: pare che questo thread richiami "updateState" all'inizio e quando termina, ma durante l'esecuzione non fa nulla, forse hai solo omesso delle parti non significative. Ovviamente la "updateState" finale la puoi mettere fuori dal ciclo while. Inoltre 4000ms di Sleep mi pare decisamente troppo. A proposito, la updateState è thread-safe vero? O aggiorna l'interfaccia grafica?codice:procedure TAggiornaStato.Execute; begin updateState; while (esegui) do begin try if (Terminated) then updateState; except on e:exception do messageDlg('Errore Thread: '+trim(e.message),mtwarning,[mbOk],0); end; Sleep(4000); end; end;
Meglio fare:codice:AGGST.fermaElaborazione //attendo il terminate repeat until AGGST.terminate;
AGGST.Terminate();
AGGST.WaitFor();
(e comunque doveva essere AGGST.terminated).