Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Multithreading o SingleUse??

Ho alcuni dubbi su come procedere per creare una applicazione che deve
compiere la seguente operazione:
connettersi tramite telnet ad un router e ricavare informazioni
statistiche sul traffico di rete.
La connessione deve essere effettuata ad intervalli regolari ed esistono
piu' routers.
Ogni router potrebbe avere il suo intervallo di "lettura".
Avevo pensato di creare una classe per ogni router, la quale si attiva
tramite un "timer di classe" per connettersi, recuperare i dati e
salvarli.
Quello che volevo sapere e' qual e' la migliore strategia per fare in
modo che ogni istanza della "classe", o dell'"oggetto" che mi
suggerirete, venga eseguita indipendentemente dalle altre (ad es.  per
evitare che una mancata connessione ad un router o una bassa velocita'
di comunicazione pregiudichino l'esecuzione di connessioni ad altri
routers).
Avevo pensato di creare un programma out-of-process, una sorta di
applicazione server che si occupa di gestire le connessioni. Non mi e'
chiaro se questa applicazione possa creare essa stessa delle istanze
della classe in multithreading o SingleUse.
Oppure e' necessario che crei una prima applicazione che crea le istanze
di una classe definita in un'applicazione out-of-process multuthreading?
Illuminatemi!
grazie
		maxx

Se ho ben capito il problema ...
immagino che la cosa più semplice sia quella di creare una classe per ogni
gestione di connessione. Le istanze delle classi le puoi creare da un
programma principale che gestisce una collection di tali classi.
Il timer sarebbe meglio che venisse gestito all'interno delle classi.
Per quanto riguarda la modalità di istanziamento della DLL ti consiglio di
utilizzare la MultiUse mentre come modello di threading è palese utilizzare
l'Apartment Threading (anche se un po' più pesante).
In questo caso non vi sono grosse differenze tra l'utilizzo di un componente
out o in process in quanto il programma principale in pratica non fa niente;
l'unico problema con la DLL è che se ti si impianta un'istanza, tutto il
programma termina mentre con EXE ActiveX no (se fai una buona gestione degli
errori)
Una bella cosa sarebbe creare un EXE ActiveX  che capisca il tipo di
esecuzione (se lanciato direttamente dall'utente oppure istanziato da un
altro programma) e che presenti un interfaccia che ti permetta di
configurare una singola connessione ad un router.
In questo caso potresti creare il componente come Thread singolo (Thread per
oggetto) ...
Facci sapere ...
    Davide



Penso che, prestazioni a parte, con vb questo suggerimento di Fox sia la
strada preferibile.
Ciao
Aldo

Forse VB implementa una tecnologia superiore (alle mia comprensione
forse!). Ma per chi decide dove deve andare VB era cosi' difficile
implementare una istruzione tipo il fork o il clone?
Se ho capito bene anch'io il problema utilizzero' il tuo suggerimento
(VB permettendo)
Vi faro' sapere ...
grazie
		maxx


In riferimento al mio post del 2 gennaio (Riassumo: voglio eseguire in
thread indipendenti delle connessioni a indirizzi ip)
Sto sviluppando il progetto utilizzando come modello il progetto Coffee
del CD MSDN di VB6.
In un form di CoffeeWat2 ho inserito un array di controlli winsock.
La mia idea era di passare ad ogni istanza dell'oggetto Coffee un
riferimento ad un controllo winsock e lasciare che le singole istanze si
occupino della gestione della connessione e del recupero dei dati.
Il problema e' che gli eventi associati ai controlli winsock vengono
(ovviamente!) generati nel form e non negli oggetti coffee.
Ho pensato di:
Ipotesi 1- ho poco tempo per concludere il progetto; quindi lascio che
il form riceva gli eventi di winsock e attiva un evento sulle rispettive
istanze di coffee.
Problema: Cosa succede al multithreading in questo modo?
Problema: Cosa succede se 2 o piu' winsock si attivano
contemporaneamente? (Es. l'evento Winsock1_DataArrival(Index as Integer,
ByVal bytesTotal As Long) viene serializzato ? In che modo viene esegito
il codice se vengono generati 2 eventi successivi relativi al medesimo
winsock o a 2 winsock diversi?)
Ipotesi 2- Poiche' e' possibile trasferire direttamente la gestione dei
winsock nella classe Coffee il problema non si pone! E' vera questa
affermazione? Ovvero esiste un metodo semplice per far gestire un
controllo da una classe.
Detto in altro modo: e' necessario associare sempre ad un form un
controllo? Perche' e' necessario usare un form per alcuni controlli come
il Timer o il Winsock che non "interagiscono" direttamente con l'utente
(dovrei probabilmente rivolgere questa domanda a MS, ma temo non mi
rispondera'!)?
Ipotesi 3- Implemento la connessione usando direttamnte le API winsock.
Non ho pero' affinita' con queste API e non vorrei perdere tempo
(perche' non ne ho molto). Questo metodo e' semplice? (La connessione
sarebbe molto semplice: connessione, autenticazione, invio di un
comando, ricezione della risposta, chiusura connessione.)
grazie mille a chiunque mi indica la via o mi chiarisce le idee.
	maxx