Newsgroup: it.comp.lang.delphi
Titolo: Problema con tcpServer

Salve a tutti.. sto realizzando un programmino che utilizza i socket,
soltanto che quando vado a gestire il thread di tcpServer non riesco a
creare un componente dinamico, perchè ovviamente quando finisce il thread
distrugge tutto.. ho provato a salvarlo in una lista globale.. ma niente..
Qualcuno sa come risolvere questo problema?
Grazie anticipatamente
Nicola
--- posted by geoForum on 
http://www.delphiedintorni.it


Potresti postare un pezzo del codice incriminato?
Ciao.
Cristiano


creare un componente dinamico, perchè ovviamente quando finisce il thread
Quali componenti e versione di Delphi stai utilizzando?
Stai usando componenti Indy?
Per realizzare un server TCP io trovo molto valido il
"TIdCmdTCPServer" (Indy).
Ciao

Io utilizzo IdTcpServer - Indy - Delphi 7
ecco qui un pezzo di codice:
Stringa := AThread.Connection.ReadLn ;
IstruzioneDaStringa(Stringa, IndirizzoIP, Testo) ;
If Not FormPresenteInLista(IndirizzoIP, Messaggi)
Then Begin
       AggiuntaFormALista(IndirizzoIP, TfrmMessaggi.Create(Application),
FormMessaggi) ;
     End;
Form := PFormDaLista(IndirizzoIP, Messaggi) ;
Form^.mmoMessaggi.Lines.Add(Testo) ;
Form^.Show ;
Praticamente mi arriva una stringa.. controllo da che pc arriva, se arriva
da un pc in cui ho gią aperto una form con i suoi messaggi, mi prendo il
puntatore alla form e aggiungo il messaggio, altrimenti creo la form in
una lista e poi mi becco il puntatore e aggiungo il testo...
Spero di essermi spiegato..
Grazie



"AThread" da dove arriva?
E' un thread che crei tu? Se si quando e come?
La lista delle form che hai creato deve essere sicuramente "esterna"
ai tuoi thread, oltre questo devi gestirla in modo "thread-safe".
Vale a dire devi assicurarti che due thread non accedano in modo
contemporaneo alla tua risorsa.
Più in generale qualsiasi cosa tu voglia usare in un thread che non
appartiene al thread stesso deve essere utilizzata con un qualche
meccanismo di lock.
Sul NG si è parlato molto molto dell'argomento
(TCriticalSection,.....), non so se il problema che "sparisce tutto" è
legato a questo ma se non hai fatto le cose che ho detto devi
provvedere...
Ciao
PS: il componente che ti ho suggerito ha una gestione dei thread
"integrata", te lo consiglio per la realizzazione di un server su
socket.

meccanismo di lock.
Sarebbe più corretto dire che va sincronizzato qualsiasi accesso a
risorse che non sono gestite in modo esclusivo dal thread.

risorse che non sono gestite in modo esclusivo dal thread.
Sicuramente una definizione più rigorosa, immagino che per
sincronizzare tu intenda che un thread che fa richiesta di una risorsa
dovrebbe rimanere in attesa che si liberi se questa non è
immediatamente disponibile (per un certo timeout ovviamente).
Ciao

 Il primo forse metteva a disposizione un thread già pronto all'uso?
Scarica la documentazione degli Indy Components dal sito ufficiale del 
progetto (
http://www.indyprojects.org
): c'è una sezione introduttiva che 
descrive le differenze principali tra le versioni 9 e 10, e può essere 
utile per modificare il codice in modo che sia compatibile con la 
versione scelta.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

immediatamente disponibile (per un certo timeout ovviamente).
"Sincronizzare" significa serializzare l'accesso a delle risorse.
Ovviamente la sincronizzazione è necessaria laddove la sovrapposizione
delle operazioni può creare problemi. Se i thread si limitano a
leggere determinate informazioni, per esempio, potrebbe non essere
necessaria una serializzazione degli accessi (che è abbastanza
penalizzante). La questione del time-out è relativa: si può farne uso
o meno.


Le form che stai creando, sono di tipo MDI oppure no?!? Perchè se non sono
MDI, capisco che quando chiudi il thread si eliminano, ma se fossero MDI,
non dovrebbero chiudersi, se non con apposito comando Free.
Ciao.
Cristiano.
Cristiano


Allora la lista di form è globale, aThread è il thread che crea la
onExecute  di idTcpSocket..
Come faccio a rendere una form normale mdi???


onExecute  di idTcpSocket..
ho provato anche a dichiarare il tipo di form MDI ma niente.. si chiude
ugualmente.. non so piů cosa fare.. eppure una soluzione deve esserci..
poi il prossimo passo č utilizzare il metodo syncronize per evitare casina
negli accessi alla lista.. non mi erano venuti in mente questi problemi..
Grazie per l'attenzione
Nicola
