Newsgroup: it.comp.lang.delphi
Titolo: Usare Thread?

Mi è stato consigliato qualche giorno fa di leggere un tutorial sui thread,
me lo sono letto e ho capito come funzionano, ma se oggi ne dovessi scrivere
uno non saprei dove mettere le mani,
Potete farmi un esempio del tipo che il client dice al server i numeri da
sommare e il server mi fa il calcolo e mi restituisce il risultato;
Oppure il client vuole inserire dati in una tabella (nome, cognome) e il
server effettua l'inserimento, o Ancora il client cerca pippo e il server
gli risponde restituendogli il o i record chiesti?
Come sempre un grande GRAZIE
Antonio.

 ha scritto nel messaggio
news:sOJsb.111702$vO5.4...@twister1.libero.it...

Stai domandando un problema di client/server, non un problema di gestione
dei thread.
Anche perchè in genere i componenti server TCP gestiscono già loro i
thread...
Boh... dal client, una volta connesso mandagli con dei writestring dei
valori in testo e come fine mandaci una scritta di conclusione es "STOP" e
si mette in ascolto del risultato. il server si aspetta di ricevere dei
valori interi fino alla scritta "STOP", dopo di chè fa la somma e scrive...
Mah, una prima soluzione buttata in 30 secondi.
Ciao
Matteo

 gestione dei thread.
Quindi scusa secondo te č inutile inviare dati ad una tabella utilizzando un
thread secondario?

 utilizzando un thread secondario?
Io non ho capito una cosa: tu vuoi imparare o vuoi la pappa pronta?
Ciao,
Andrea



Beh sei un po' troppo generico ;-)
Visto che stai imparando l'uso dei thread ti consiglio un'altra
utilissima lettura.
http://www.pergolesi.demon.co.uk/prog/threads/ToC.html
che tra l'altro termina con un esempio concreto sull'uso dei thread
con TCP/IP
-- 
"La velocità luce non è sufficiente Comandante Nunziatella, 
dobbiamo passare alla velocità smodata!"

 Io non ho capito una cosa: tu vuoi imparare o vuoi la pappa pronta?
Io voglio imparare e poi non mi sono mai piaciute le cose già pronte.
Sinceramente pensavo di aver chiesto solo qualche esempio semplice che mi
chiarisse meglio le idee.

gli risponde restituendogli il o i record chiesti?
Non mi sembra di essere stato generico, d'altronde gli esempi siano anche
semplici :
il primo è la somma di due numeri inviati dal client calcolata dal server e
il risultato restituito al client
il secondo è l'inserimento di record inviati al server su una tabella che si
trova sul server
il terzo è la query di alcuni records dal client che interroga il server e
riceve dal server i records chiesti.

 che mi chiarisse meglio le idee.
Ciao,
Scusa per la rudezza ma da certe cose che hai scritto, questa era
l'impressione che mi
avevi dato.
Ad ogni modo, creare ed usare un thread non è complicato, anzi.
Il vero problema con i threads sono i deadlocks, cioè le situazioni di
stallo.
Per usare un thread devi creare una nuova unit( o usarne una esistente,
anche se io ti
consiglio la prima ) dove mettere la tua classe derivata da TThread.
Se usi i Wizard di Delphi, vedrai che la tua classe già contiene l'override
di
Execute. Questo è il metodo che viene richiamato dal thread e che serve per
stabilire la vita del thread stesso.
Se si vuole mantenere il thread in vita in modo continuato, in genere
nell'Execute si
scrive qualcosa tipo:
while Not Terminated do
begin
  // Qui ci va il codice del thread
end;
Terminated è una proprieta' che indica se il thread è in chiusura( impostata
da Terminate ).
Ad ogni modo, l'unica via per capire come funzionano è utilizzarli e
guardare l'aiuto in
linea che ti offre Delphi.
Venendo al tuo problema, si ha senso mettere un socket all'interno di un
thread,
considerando però quanto segue:
1) I vari componenti socket sono già in grado di gestire i threads, quindi
se
quello che vuoi fare è mettere in ascolto una porta e/o compiere una sola
operazione, non ti conviene usare i threads.
2) Se vuoi mettere assieme piu' operazioni che agiscono su porte diverse,
allora ha senso usare i threads, meno che nel caso in cui le porte sono in
ascolto( server ).
L'esempio piu' banale è un download manager: caso classico in cui usare i
threads puo'
essere una buona scelta.
Caso classico in cui puo' essere una *pessima* scelta( a meno di specifiche
particolari ):
server di chat.
Tieni conto che non puoi - da un thread - far eseguire del codice nella
form: l'unico
modo per farlo è usare Synchronize, la quale però alla fine dei giochi fa
eseguire la
routine direttamente dall'interno dello spazio di indirizzamento della form
stessa.
Ciao,
Andrea

 della form stessa.
Questa ultima cosa non l'ho capita.

 Questa ultima cosa non l'ho capita.
Synchronize fa in modo che la routine "sincronizzata" venga richiamata
dalla form, anche se tu - materialmente - non lo fai esplicitamente.
Detto in termini pratici, se tu hai un metodo nel thread
"AggiornaProgressBar",
Synchronize farà in modo che sia la form a chiamare "AggiornaProgressBar"
quando necessario.
Tutto qui.
Ciao,
Andrea


http://www.pergolesi.demon.co.uk/prog/threads/ToC.html
Gran bel link, complimenti per averlo trovato :)
-- 
Morde. 
(
mo...@despammed.com
)


Consideriamo sia questo il caso a me mancano proprio le
procedure :
   InviaCifreAlServer;
   PrendiRisposta;
Grazie Ancora
Antonio.

 Antonio.
Andrea

 server, ecc...  dacci qualche altro dettaglio e vedremo di aiutarti.
Allora io voglio solo costruirmi un piccolo esempio che faccia questo :
C'ho due edit in cui inserisco le due cifre e voglio inviare queste cifre al
server e fare in modo che lui mi calcoli la somma di queste due cifre e me
la restituisca in un terzo edit, i componenti sono gli indy.
In realta mi piacerebbe inviare record di tabelle ma questo esempio potrebbe
aiutarmi a capire come fare.

 potrebbe aiutarmi a capire come fare.
Ciao,
Allora guarda: se vuoi mandare dei record, hai diverse opzioni prima di
fare le cose da te: che versione di Delphi hai? Che edizione?
Se hai la 6 o la 7, dalla Enterprise in su, hai gia' tutti gli strumenti per
fare data-remoting.
Se non hai le edizioni "mega" di Delphi, non ti perdere d'animo:
per pochi dollari puoi comprare RemObjects standard, che ti
consente di fare un pacco di robe, compreso remoting di intere
gerarchie di classi in modo estremamente semplice e veloce.
Se poi non vuoi proprio spendere soldi, puoi cercare su Google
"Francois Piette" e sul suo sito troverai tutto quello che serve per
fare del MiddleWare spinto :-)
Tutto questo senza nemmeno sapere come funziona... se poi
proprio ti interessa sapere come funziona il tutto, su Mastering Delphi 5 di
Marco Cantů c'č tutto un programma che ti mostra come fare tutto.
Ciao,
Andrea

la domanda va posta in altro modo:
ATE *SERVE* mandare dati ad un qualcosa mentre la tua applicazione fa 
altre cose?
il thread non serve a fare un qualcosa di specifico tipo una op sul 
database +ttosto che la creazione di un file di log o l'invio di email.
Un thread serve a far fare alla tua app una QUALSIASI cosa (+ o 
meno....) mentre ne fa un altra.
A

sul tuo form hai un pulsante al quale associ la creazione di un 
messaggio che tramite indy mandi alla tua app server.
Tale app server decodifica il messaggio, capisce che č stata richiesta 
la somma dei 2 numeri inclusi nel msg, la calcola e produce un msg di 
risposta che invia subito al client che, in uno degli eventi di lettura 
dati legge la risposta, estrae il risultato e lo mette nella 3a tedit.
Il tutto senza thread....
A

 server e riceve dal server i records chiesti.
Esempi che nulla hanno a che fare con il subject.
Comunque, essendo come dici gli esempi semplici, direi che un ottimo
esercizio puo' essere di implementarli ciascuno in un metodo o in una
classe.
Una volta fatto questo, trasferire la funzione o la classe in un thread.
Infine, verificare i risultati ottenuti con quelli attesi. Se
coincidono, complimenti!, altrimenti, posta i dubbi e le perplessita'.
Vedi anche 
http://www.catb.org/~esr/faqs/smart-questions.html
(non che qui si sia _cosi'_ esigenti, ma sicuramente un approccio simile
aiuta ad essere aiutati)
Saluti
Paolo Arosio
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare"