Newsgroup: it.comp.lang.delphi
Titolo: Indy component

Ciao a tutti!
Qualcuno usa il componente Indy? Avrei bisogno di alcune informazioni
sull'utilizzo dei threads...
Grazie mille!!

Il problema è questo: ho sviluppato un'applicazione che usando un
thread primario, che lancia dei threads figli, scarica delle pagine
web. Nonostante abbia creato un controllo sul numero di threads figli,
quando esegue molti cicli di creazione dei threads figli, si blocca
l'applicazione, perchè aspetta la terminazione di alcuni threads...
Quindi:
siccome Indy ha dei componenti che permettono la programmazione
multi-thread, come ad esempio idThred, vorrei sviluppare l'applicazione
seguendo tutta la logica di Indy... Avrei bisogno di un tutorial che mi
spieghi il multi-thread con Indy
Grazie mille!! A presto!

 spieghi il multi-thread con Indy
Se cerchi documentazione, prova a partire da questa pagina:
http://www.indyproject.org/Sockets/Docs/index.iwp


Grazie per il suggerimento Marco. Darò subito uno sguardo... Tu hai
mai usato Indy? Avrei bisogno di informazioni sul suo utilizzo in
multi-threading
Grazie! :-)

 multi-threading
Sì, ho utilizzato Indy in progetti che coinvolgevano i componenti 
*TIdPOP3*, *TIdSMTP*, *TIdSMTPServer* e *TIdPOP3Server*.
Per i componenti che costituiscono un server, Indy dispone di una 
gestione interna dei thread; in questo senso, non ho avuto necessità di 
fare molto se non quello di gestire "lock" e "unlock" degli appositi 
meccanismi di sincronizzazione nella gestione degli eventi...e non so 
nemmeno sicuro che sia necessario con Indy. :-)


Grazie per le info Marco!
L'help che ho trovato sul sito è molto utile... però ancora non sono
riuscito a fare quello che volevo col multi-thread. In pratica, la mia
esigenza adesso è inviare tramite TIdSMTP contemporaneamente 4 email.
Perciò dovrei far ricorso a 4 threads che le inviano
simultaneamente... Ricordo che alcuni anni fa avevo utilizzato una
classe di Indy, mi pare TIdThread, con la quale implementare il
multi-threading.
Qualche idea?
A presto! Grazie

carmelo ha scritto:

Se non ricordo male (che significa semplicemente "potrei sbagliarmi"), i 
componenti per la gestione dei thread (come quelli che forniscono un 
"thread pool" e parenti) sono utilizzabili unicamente da componenti che 
rappresentano un *server*.
Per i componenti *client*, come quello che stai utilizzando tu, io ho 
implementato "manualmente" i thread necessari: in sostanza, ho costruito 
una classe di thread che, creando al suo interno un componente client, 
si occupa di eseguire l'operazione correlata (il download di messaggi 
nel caso del TIdPOP3, l'invio di messaggi nel caso di TIdSMTP e così via).
I componenti utilizzano una "logica bloccante", cioè non è necessario 
gestire manualmente cicli di attesa per verificare quando ha termine una 
determinata operazione: il metodo che la esegue "ritorna" quando essa è 
terminata.
Questo aiuta a sviluppare il programma con una "logica sequenziale", più 
semplice, valida anche quando il processo viene spostato dal thread 
primario e inserito poi in thread secondari.


Ho letto tutti i post.
Allora, dovendo scrivere un applicazione client non puoi usare il componente
idThread, in quanto quello è una facilitazione per i componenti server
(come già detto da Marco).
Il problema dei thread, hai provato a sganciare il client SMTP dai thread ed
inserire degli sleep per vedere se il problema è di Indy in multithreading
o della gestione che viene fatta dei thread. 
Tempo fa Win aveva un limite funzionale sui thread, in pratica il S.O. ti
permetteva di aprire quanti thread volevi, ma se il numero passava i 16
l'applicazione tirava una serie di errori di dubbia provenienza.
Se devi mandare una stessa mail a più indirizzi puoi farlo specificando
tutti gli indirizzi e inviandone una sola.
Hai provato a fare uno spool? Cioè, in uno stack inserisci le mail da
inviare e un thread si preoccupa di mandarle uno alla volta. Oppure il
carattere di contemporaneità è indispensabile(conoscendo i meccanismi della
posta elettronica credo di no)?
Bye,
Raktzo

L'invio delle email con un solo thread funziona benissimo. Il problema
è che, per impiegare meno tempo nell'invio, vorrei utilizzare più
threads che inviano in simultanea. Comunque credo che si possa
risolvere utilizzando la normale classe TThread, e implementando tutto
il necessario lì dentro...
Volevo utilizzare le classi di Indy che gestiscono i threads perchè la
mia gestione dei threads ha qualche errore: il programma spesso si
inceppa, come se stesse aspettando la terminazione di qualche thread...
Forse devo riprogettare la gestione dei threads figli, che inviano
l'email, da parte del thread primario, che controlla i figli.
Se qualcuno è disposto a dare uno sguardo al mio codice, gli invio il
sorgente
Grazie mille! A presto!

 threads che inviano in simultanea. [...]
Cosa intendi precisamente con l'invio in simultanea? Spero tu non voglia 
inviare piů messaggi contemporaneamente allo stesso server SMTP. :-)


Per invio in simultanea intendo:
- invio diretto, senza SMTP server, di più email
Per l'invio di più email tramite l'SMTP server non è indispensabile
avere più threads, l'invio è veloce... comunque, siete sicuri che lo
stesso SMTP server non possa accettare più connessioni da uno stesso
IP ?

 IP ?
Da uno stesso IP si, forse non accetta più connessioni da uno stesso utente.
Questo però dipende dalle policy del server stesso
Bye,
Raktzo

 IP ?
Sicuramente sarà in grado di accettarle, ma non so quale vantaggio possa 
esserci poichè più operazioni esegui contemporaneamente più diminuisce 
la banda disponibile, oltre al fatto che se si tratta di collegarsi allo 
stesso server SMTP l'handshaking (passatemi il termine) per avviare una 
sessione verrebbe eseguito più volte con un tempo richiesto maggiore 
nella conclusione dell'operazione nel suo complesso. Che ne pensi?


Per invio in simultanea intendo:
- invio diretto, senza SMTP server, di più email


 colloquiare, no? ;-)
Se hai un SMTP in locale, o puoi accedere al suo spool, puoi mandare le
email semplicemente lasciando il file dentro lo spool senza passare per il
server SMTP. Ma questo è un giochetto che viene sempre più eliminato,
avvolte l'SMTP si inalbera o può essere sfruttato in modo illecito.
Bye,
Raktzo

Per spedire le email senza passare dal server SMTP del provider, basta
trovare l'MX Record del dominio dell'email e poi collegarsi al suo SMTP
server per spedire...

 server per spedire...
In questo caso passi sempre per un SMTP, con tutto quello che il protocollo
SMTP comporta.
Continuo a non capire una cosa, devi spedire uno stesso messaggio a diversi
destinatari o per ogni destinatario hai un messaggio diverso?
Bye,
Raktzo

Per ora uno a tutti

 Per ora uno a tutti
In tal caso, ti basta comunicare al server SMTP che usi per la 
spedizione - che sia un server locale, che sia quello del provider o il 
server direttamente ottenuto dal record MX - la lista degli indirizzi 
effettivi (recipienti) a cui il messaggio va inoltrato.
Eventualmente, crea un'istanza del componente *TIdMessage* nel quale 
provvedi ad inserire, prima dell'invio attraverso il client *TIdSMTP*, i 
destinatari sfruttando la proprietà /BccList/.
In seguito, utilizza il metodo /Send/ del componente *TIdMessage* per 
inviare il messaggio; in fase di colloquio con il server SMTP, il 
componente *TIdSMTP* comunicherà i recipienti designati alla ricezione 
del messaggio e, in seguito, il corpo del messaggio stesso.


E ti stai a complicare cosi la vita?!?
Segui il consiglio di Marco
Fai un solo invio al tuo SMTP e lui provvede a recapitare i messaggi ai vari
destinatari senza che tu te ne preoccupi.
Bye,
Raktzo

si è vero. se invii dallo stesso SMTP al massimo 500 messaggi però...
altrimenti devi per forza di cose fare come faccio io: bypassare l'SMTP
del tuo provider ed inviare singolarmente ogni messaggio

 del tuo provider ed inviare singolarmente ogni messaggio
Sě, č possibile che il server SMTP non ti accetti un elevato numero di 
destinatari (dipende dalle regole impostate in modo specifico per 
ciascun server SMTP)...tuttavia, visto che sei tu a dover gestire 
tramite codice l'elenco dei destinatari, nulla ti vieta di suddividere 
gli indirizzi in piů gruppi di un numero max di elementi e confezionare 
un messaggio per ciascuno di questi da inviare.
Se bypassi l'SMTP del provider e invii il messaggio direttamente al 
server ricavato dal record MX, allora č un'altra storia, ma comunque non 
aprirei un thread per ciascun messaggio/destinatario: potrebbero essere 
davvero tantissimi.
Comunque, sto un po' perdendo di vista il percorso di questa 
discussione; mi spiego: non so bene cosa tu stia cercando di realizzare 
in fondo, quindi ogni opinione che viene espressa, da te o da me o da 
altri, č sempre valida, ma bisogna vedere se si applica correttamente al 
caso in esame, cioč al tuo problema.
Magari, descrivi accuratamente ciň che devi realizzare in termini di 
"scopo", cosě possiamo vedere alla fine qual č la soluzione piů adatta 
senza valutare singole soluzioni che, prese distintamente possono essere 
valide ma, se considerate nel contesto, non sono applicabili o sono 
sconsigliate.


> si è vero. se invii dallo stesso SMTP al massimo 500 messaggi però...
500 messaggi o 500 destinatari?
nel secondo caso nessuno ti vieta di madarne 499, logout, login, altri 499 e
così via. Probabilmente quel limite è fatto per impedire lo spamming.
Oppure montati un MTA (qmail, postfix), scarica in locale le mail e poi il
tuo MTA provvederà le corrette recapitazioni.
Bye,
Raktzo