Newsgroup: it.comp.lang.delphi
Titolo: threads

scusate se farò domande banali, ma sono un supernewbye dell'argomento
"thread in delphi".
ordunque, devo fare un programma, l'operazione principale ha dei tempi di
attesa piuttosto lunghi, e tale operazione deve essere ripetuta circa un
migliaio di volte, quindi ho pensato fosse opportuno splittare l'operazione
in più thread.
ora c'è una cosa che mi sfugge... io posso passare ai thread delle variabili
del programma principale (mettendoli come parametri della procedura con cui
chiamo il thread), ma posso io modificare detta variabile nel programma
principale?
cioè, se ad esempio io ho un contatore inizializzato a 0. il thread non deve
far altro che incrementare tale contatore, e arrivato a 500 fermarsi. se
però invece di un thread solo ne creo 2, il primo incrementa il contatore da
0 a 1, al secondo io non devo passare come parametro il contatore come 0, ma
come 1, e quindi lui lo incrementerà da 1 a 2. il primo, adesso, non
dovrebbe più incrementare da 1 a 2, lo ha già fatto il secondo thread, ma
dovrebbe incrementare da 2 a 3, e così via, velocizzando l'arrivo a 500. e
questo non capisco come farlo.
secondo problema: quando uso syncronize, mi pare di aver capito che non
posso usare fare synchronize(miaprocedura(parametro))... è vero o è un mio
errore? io posso anche ovviare al passaggio del parametro, creando una
variabile globale per il thread, è solo una precisazione.
se poi durante l'esecuzione del thread volessi accedere, in lettura e
scrittura, ad una variabile del programma principale o di un altro thread,
che non avrebbe senso passare all'inizio perchè durante l'esecuzione del
thread potrebbe essere stata modificata, come faccio?
vi ringrazio, e nel caso avessi scritto fregnacce mi scuso in anticipo.
ciao
oscar

 thread potrebbe essere stata modificata, come faccio?
Come detto, crei la variabile globale, e ci accedi prestando attenzione alle
criticita'.
Uff ho scritto pure troppo :)
Ciao!
{MSX}

ti ringrazio, ora leggo tutto bene, digerisco il discorso, faccio le prove e
spero che tutto vada ok.
grazie ancora
oscar

variabili condivise (il tuo contatore) su un blocco CriticalSection.
Posso usare Critical section se ho due threads che fanno riferimento alla
stessa porta COM, o devo fare in altro modo?
Help!
    Ciao.

 Help!
teoricamente si. La CriticalSection si usa per ogni genere di risorsa
condivisa che necessita un accesso esclusivo in lettura/scrittura.
Nel caso della porta com, pero', c'e' qualche problema in piu'.. se ciuascun
thread opera una sua connessione, basta che ti accerti che all'uscita dalla
CS la porta sia ripristinata e la connessione chiusa. Se invece diversi
thread leggono dalla stessa connessione, immagino che nascerebbero casini,
in quanto tu non puoi sapere a priori quale dei due thread ha letto un certo
dato... Al massimo puoi essere sicuro che nessun dato venga perso per
criticita' non risolte.
Comunque non me ne intendo molto di porte COM, e bisogna vedere cosa devono
fare i due thread..
Ciao !                    {MSX}

 questo non capisco come farlo.
[...]
Attenzione che non e' detto che risulti piu' veloce l'arrivo a 500
usando piu' thread su una macchina normale. Anzi, in generale sara' piu'
lento a causa della necessita' di svitchare fra i diversi thread (ed
escludendo il problema della sincronizzazione mediante mutex o
criticalsection).
L'uso del multi-threading si rivela particolarmente utile quando
desideri che una elaborazione particolarmente lunga non blocchi altre
elaborazioni (in particolare, per i programmi normali, il refresh della
GUI, ma potrebbe essere l'ascolto su una porta). In casi del genere
metti l'elaborazione lunga in un thread; spezzare l'elaborazione fra +
thread (a meno di casi particolari) dovrebbe peggiorare le prestazioni.
Per cio' che riguarda i meccanismi di comunicazione col thread
principale della VCL puoi usare, oltre a Synchronize e alle CS,
PostThreadMessage.
Vedi, inoltre,
http://community.borland.com/article/0,1410,22411,00.html
http://www.sklobovsky.com/community/threadmare/threadmare.htm
http://www.sklobovsky.com/community/threadmare/perks.htm
--
Saluti
Paolo Arosio

ti ringrazio per la risposta, piů materiale ho da consultare meglio capisco
(forse, visto che manco di neuroni ^_^).
cmq credo che i thread siano la scelta piů corretta, infatti li voglio usare
perchč l'operazione centrale, il clue del programma, deve attendere a lungo
una risposta, che cmq non influenza i cicli successivi, ergo, se posso far
svolgere in "parallelo" un numero maggiore di operazioni dovrei diminuire i
tempi di esecuzione.
ciao
oscar