Ho un codice a Delfi, che esegue le seguenti operazioni:quando si termina() una discussione (classe TThread), esce ogni figlio di questa discussione?
procedure THilo.Execute; // (which is the thread)
begin
inherited;
FreeOnTerminate := True;
while not Terminated do
begin
(...)
Sleep(100);
end;
end;
e ora da qualche altra parte, in un altro thread (o la GUI) facciamo questo:
var
Hilo2: THilo;
begin
Hilo2 := THilo.Create(True);
Hilo2.start;
Hilo2 := THilo.Create(True);
Hilo2.start;
end;
ora abbiamo eseguito 2 volte lo stesso thread e funzionano parallelamente. Che cosa succede se facciamo ora questa ?:
Hilo2.Terminate;
sarà presente sospendere entrambi i fili o solo 1, o che cosa? inoltre, se volessimo interromperlo, potremmo raggiungere questo risultato tramite .Resume()?
Grazie in anticipo
Grazie J, ho avuto nel mio programma questo e non è stato possibile terminare i thread in modo che venisse corretto solo con un array di TThread, giusto? come 'Hilo [i]: = THilo.Create (True); Hilo [i] .start; ' – user2308704
Oh - un altro esperto sviluppatore multithread Delphi. Questo rende almeno due di noi :) –
Inoltre, dal momento che 'FreeOnTerminate = True' è in uso, se il thread termina prematuramente (eccezione non rilevata, ecc.), Quindi chiamare' Terminate() 'potrebbe non funzionare (o peggio, memoria corrotta) se il thread è già andato. 'FreeOnTerminate = True' dovrebbe essere usato solo per i thread create-and-forget. Non appena si deve toccare esternamente un thread per ** qualsiasi ** motivo (sospendere/riprendere, terminare/attendere, aggiornamenti/accessi ai membri, ecc.), Non utilizzare 'FreeOnTerminate = True'! –