È necessario verificare la presenza di una terminazione nella filettatura affinché funzioni. Per esempio:
procedure TMyThread.Execute;
begin
while not Terminated do begin
//Here you do a chunk of your work.
//It's important to have chunks small enough so that "while not Terminated"
//gets checked often enough.
end;
//Here you finalize everything before thread terminates
end;
Con questo, è possibile chiamare
MyThread.Terminate;
e si metterà a terminare non appena termina l'elaborazione di un altro pezzo di lavoro. Si chiama "graceful termination thread" perché al thread stesso viene data la possibilità di terminare qualsiasi lavoro e prepararsi per il termine.
C'è un altro metodo, chiamato "terminazione forzata". È possibile chiamare:
TerminateThread(MyThread.Handle);
Quando si esegue questa operazione, Windows interrompe in modo forzato qualsiasi attività nel thread. Questo non richiede il controllo di "Terminato" nel thread, ma potenzialmente può essere estremamente pericoloso, perché stai uccidendo thread nel bel mezzo dell'operazione. Dopo di ciò, la tua applicazione potrebbe bloccarsi.
Ecco perché non si utilizza mai TerminateThread finché non si è assolutamente sicuri di avere tutte le possibili conseguenze accertate. Al momento non lo fai, quindi usa il primo metodo.
Grazie Timo. Risposta chiara ed esempi. – Dylan
E grazie anche a te stesso. un ottimo esempio. – Dylan
Non solo l'applicazione potrebbe bloccarsi, ma anche le risorse utilizzate dal thead non verranno deallocate. TerminateThread() è una chiamata "extrema ratio". –