Newsgroup: it.comp.lang.delphi
Titolo: Thread con FreeOnTerminate:=True

Come dal titolo sul Create imposto un Thread a FreeOnTerminate:=True;
Il thread viene terminato e nel ricrearlo vorrei (mi sembra corretto) usare:
if Thread1=Nil then
    Thread1.Create;
non posso!!! perche' pur liberandolo, al suo termine, delphi lascia il suo 
puntatore inalterato.
Che fare?
Giorgio


Potresti creare un TEvent, che il thread segnala prima di morire e che 
il programma principale testa al posto del thread=nil.
Un po' come cacciare le mosche col cannone ma dovrebbe funzionare! :)
Ma il FreeOnTerminate e' davvero essenziale per quello che devi fare?
ciao
Giacomo

puntatore inalterato.
Ci risiamo con questa tecnica.  Ti è stato già detto tempo fa che non
è quella corretta.  Intercetta l'OnTerminate e ricrea un nuovo thread.
E' ovvio e corretto che Delphi lasci il puntatore inalterato.

"Andrea Laforgia" <a.laf...@andrealaforgia.it.invalid> ha scritto nel 
messaggio news:40tof252pnn9qstc3...@4ax.com...

Gia' fatto, era meglio pero' un FreeAndNilOnTerminate,
Giorgio 

Gia' fatto, era meglio pero' un FreeAndNilOnTerminate,
No, non lo era, per i motivi gią spiegati tempo fa.

"Andrea Laforgia" <a.laf...@andrealaforgia.it.invalid> ha scritto nel 
messaggio news:7q2pf2hknabia43ik...@4ax.com...

In effetti Delphi non puo' farlo.
A chi interessa ho risolto cosi':
Nel Thread1 ho inserito un campo public Punta: PInteger;
Alla creazione del thread1:
if Thread1=Nil then
    begin
    Thread1:=TThread.Create;
    Thread1.Punta:=@Thread1;
    end;
Nel Create viene impostato FreeOnTerminate:=True e
OnTerminate:=Termina;
cosi' viene sfruttato l'evento OnTerminate dove implemento:
procedure TThread1.Termina(Sender: TObject);
begin
Punta^:=Integer(Nil);
end;
Giorgio 

 if Thread1=Nil then [...]
A chi interessa, consiglio di leggere il thread in cui abbiamo discusso di
questa cosa MOLTO tempo fa.  Quella che suggerisci č una pessima tecnica
di programmazione (oltre al fatto ch non bisogna mai fare riferimento a
un'istanza specifica di una classe, all'interno del codice di una classe).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 un'istanza specifica di una classe, all'interno del codice di una classe).
Dove avrei messo l'istanza specifica ad una classe all'inteno della sua 
implementazione? guarda che ti sbagli
Giorgio 

 implementazione? guarda che ti sbagli
Non mi sbaglio: "Punta" contiene il valore dell'istanza della classe e
questo è un controsenso.  Stai ignorando tutte le raccomandazioni fatte in
quel vecchio thread, per riproporre questa tecnica, della cui efficacia
sei evidentemente molto convinto. Bah.



Stai sbagliando in quanto Punta e' come se contenesse Self e cio' e' 
corretto!!! la contro-prova e' che per quanto cambi nome al trhead la 
tecnica funziona e non da alcun errore di sorta.
giorgio 

 tecnica funziona e non da alcun errore di sorta.
Sei tu che ti sbagli: la natura e lo scopo di Self non è lo stesso del tuo
"Punta".  Quello che non riesci a capire, ora come allora, in quel famoso
thread, è che la tecnica che stai suggerendo è CONCETTUALMENTE SCORRETTA. 
Che un codice POSSA funzionare e non dare errori è scontato, ma ciò NON
implica di certo che il concetto che implementa sia corretto.  Non è
concettualmente corretto che il codice di una classe contenga istruzioni
che impostano un valore specifico di quella che sarà l'ISTANZA della
classe.  Questo è quello che tu fai valorizzando la memoria puntata da
"Punta".  Rileggiti il vecchio thread, non ho voglia di riproporre quella
polemica, alla fine della quale peraltro desti ragione ai tuoi
interlocutori ;-)


La FreeOnTerminate è molto utile.
Solo un TThread è dotato di questa feature ed è una cosa utile. Il
problema è che essendo un \"Thread\" a parte, se non ci fosse questa
interessante feature, dopo avergli dato la Terminate, dovresti mandare un
messaggio dal Thread al MainThread per chiamargli la Free quando
effettivamente il Thread ha completato il suo ciclo di execute.
Tutti gli altri discorsi ... sono cose da \"Fenomeno del Newsgroup\".
Del tutto fuori luogo, peraltro.
Nome Falso
Andrea Laforgia ha scritto:


 effettivamente il Thread ha completato il suo ciclo di execute.
Astieniti dal dire cretinate.  Esiste, come già detto agli inizi del
thread, la OnTerminate.


 interlocutori ;-)
Ognuno ha i suoi tabu' e non voglio discutere se uno e' convinto dei suoi 
concetti... ma la programmazione non e' questione di opinione a mio parere.
Se c'e' qualcosa di scorretto o potenzialmente "pericoloso" bisogna metterlo 
in evidenza con esempi e non dirlo a parole e basta, mica siamo tra umanisti 
dove
vale tutto e l'opposto di tutto!
Per quanto riguarda la vecchia discussione diedi ragione sul fatto che 
Delphi non poteva fare il Free... e non su quest'altro argomento.
Giorgio

 mica siamo tra umanisti 
Rivedi il vecchio thread.


Ola Sveltone... dai uno sguardo qui sotto (Unit Classes.pas):
FINALLY
    FreeThread := Thread.FFreeOnTerminate;
    Result := Thread.FReturnValue;
--> Thread.DoTerminate; <--
    Thread.FFinished := True;
    SignalSyncEvent;
    if FreeThread then Thread.Free;
  {$IFDEF MSWINDOWS}
    EndThread(Result);
  {$ENDIF}
END
Se dalla OnTerminate .... fai una FREE del thread .... Cosa SUCCEDE ?
Datti una bella calmata e vedi di farti una scopata ogni tanto.
Non mi abbasso al tuo livello dicendoti cose del tipo:
CRETINO IDIOTA ZOTICONE IGNORANTE SVELTO etc etc
.. diciamo che mi limito a dirti:
sei un poveraccio.
Nome Falso.
Ps: se vuoi imparare qualcosa, vatti anche a guardare la Destroy del
TThread.
Andrea Laforgia ha scritto:


 Se dalla OnTerminate .... fai una FREE del thread .... Cosa SUCCEDE ?
Mai detto che bisogna fare una Free nella OnTerminate, stupido imbecille,
ma che il chiamante può accorgersi che il thread è terminato intercettando


Brutto coglione,
e quando il chiamante si accorge della Terminate cosa fa ?
Si manda un messaggio al MainThread per Freeare correttamente il thread
.. o comincia una danza tribale con cornamuse al seguito aspettando un
GarbageCollector che ti si porta via nel cesso insieme a quella testa
rovinata che ti ritrovi?
Andrea Laforgia ha scritto:


 Si manda un messaggio al MainThread per Freeare correttamente il thread
Taci, imbecille incapace.  Non mi spreco neanche a insegnarti come si
sviluppa un'applicazione multithread.


Caro Andrea,
come si dice \"QUI CASCA L\'ASINO\"
Appena non sono 2 coglionetti che ti chiedono 4 cavolate (gente che
peraltro vuole solo una mano da qualcuno, non certo avrebbero scelto te)
.. si vede quanto ne sai veramente. Non è che tu sia COMPLETAMENTE
IGNORANTE, sei uno smanettone da newsgroup che gioca a fare il grande con
gente che semplicemente ne sa un po\' meno di te; anni e anni qua sopra
.. avrai anche imparato qualcosa, nessuno lo nega.
C.v.d.
Sei un buffone.
Spero che questi post diventino famosi su questo Newsgroup, credo che oggi
abbiamo tutti capito quanto vale Andrea Laforgia come programmatore.
Ora ... stai attento a come darai le prossime risposte, altrimenti con
questa scaletta di post ti ci faccio anche un sito e posto il link qua
sopra una volta al giorno. Confido che tu abbia imparato la lezione, caro
sveltone OOP-eXtremProgrammer-SoftwareArchitect dei miei stivali.
Ciao a tutti.
False Name ;-)
Andrea Laforgia ha scritto:
