Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Istanze di una classe - threading model

In un progetto DLL-ActiveX dovrei fare in modo che una (fra tante) classe
pubblica possa essere referenziata una sola volta.
Cioč (in parole povere) i vari progetti esterni che usano questa classe
devono accedere alla medesima istanza.
Come accidenti si fa in VB?
Ciao.

Credo tu debba esporre la classe come proprietà di un' altra classe,
all'interno di questa proprietà verifichi, se l'oggetto non esiste lo crei e
lo ritorni, altrimenti ritorni la stessa istanza della classe
precedentemente creata.
La creazione di piu' oggetti 'padre' non crea problemi in quanto, l'istanza
della classe sarà global, quindi pur avendo più istanze dell'oggetto padre,
la classe esposta dalla proprietà è sempre la stessa, magari metti questa
proprietà come default.
Il tuo è un classico esempio di classe shared, che finalmente in VB.Net sarà
disponibile.
HTH
Corrado

 proprietà come default.
Questo non credo risolva niente perchè  se creo più istanze della classe
contenitore automaticamente creo nuove instanze anche per la contenuta.
A meno che non ci sia qualche settaggio di qualche proprietà che non mi hai
detto :)
Ciao

 ha scritto nel messaggio
news:aLni7.31632$vC1.3...@news1.tin.it...

in c++ ti direi di creare un nuovo tipo di messaggio windows e poi
sendmessage...
in vb non so quanto sia possibile non ho mai provato.
Un altro consiglio potrebbe essere quello di creare un secondo activex a
thread singolo (perň anche questo non so quanto possa rientrare nel tuo
caso)da richiamare poi dal primo come funzione ad accesso singolo
ciao
--
-------
sito: 
www.dadev.it
ultime: Ocx per irc testi freeware
-------

 detto :)
Non e' un problema di settaggi, Corrado intendeva dire che devi dichiarare
una istanza globale *a livello di programma* della tua classe per poi
implementare, in una classe contenitore, una property di questo tipo:
Property Get ClasseFiglia() As CClasseFiglia
'NB:  gClasseFiglia e' definita come Public
'     in un modulo BAS
'     CClasseFiglia e' impostata a PublicNotCreatable
If gClasseFiglia Is Nothing Then
    Set gClasseFiglia = New CClasseFiglia
End if
Set ClasseFiglia = gClasseFiglia
End Property
a questo punto i client ricevono tutti la stessa istanza di CClasseFiglia
indipendentemente da quante istanze del contenitore vengono create.
Ciao
--
Luca Dormio
luca....@tin.it

Esattamente, Grazie per la precisazione.
Corrado


ma che c'entra?
ma quando crei un'istanza principale è sempre nothing la figlia :))
come fai a rendere globale per tutte le istanze dell'activex ? :))
mah...


 mah...
Rileggi bene il commento in cima: gClasseFiglia e' una variabile pubblica in
un *modulo di codice*, questo vuol dire e' visibile da tutto il progetto,
compresa una qualunque istanza della classe contenitore; quindi non e'
sempre nothing, viene istanziata la prima volta che invochi la Property Get
e rimane istanziata per tutta la vita del programma...
Ovviamente questo partendo dal presupposto che la classe contenitore sia
MultiUse e non SingleUse, ma questo credevo fosse scontato (infatti si
parlava di DLL ActiveX), altrimenti la domanda iniziale ha poco senso.



ho capito benissimo il fatto che mi risulta che rimangono separati e non
puoi assolutamente usare la stessa classe .
Chiaramente sto parlando di un modulo inserito in un progetto activex.
Cmq non voglio assolutamente avere ragione anche perchè non sono certo al
100% che non si possano usare in maniera diversa......
ai posteri la sentenza ehehehehe
ciao


 Chiaramente sto parlando di un modulo inserito in un progetto activex.
Se la classe contenitore e' MultiUse e l'ActiveX non sfrutta il
multithreading allora le variabili globali sono sicuramente accessibili da
tutte le istanze.
Si puo' verificare facilmente con una piccola prova:
in un Progetto ActiveX con un BAS e un CLS
'Modulo BAS
Public iGlobalTest As Integer
'Modulo CLS "Class1"
Public Property Get Test() As Integer
Test = iGlobalTest
End Property
Public Property Let Test(ByVal iNewValue As Integer)
iGlobalTest = iNewValue
End Property
da uno o piu' progetti client
Dim c1 As Project1.Class1
Dim c2 As Project1.Class1
Set c1 = New Project1.Class1
Set c2 = New Project1.Class1
c1.Test = 1234
Debug.Print c2.Test


 > Chiaramente sto parlando di un modulo inserito in un progetto activex.
qualcuno ha detto che le persone intelligenti dovrebbero ammettere i propri
errori :))
Hai sicuramente ragione funziona benissimo le variabili sono globali.


 Hai sicuramente ragione funziona benissimo le variabili sono globali.
Faccio lo stesso anch'io allora, non e' vero che funziona cosi' bene :-)
(vedi thread nuovo)


 (vedi thread nuovo)
si infatti nel riferimento alla class c'è qualche problema ma mi sono
chiarito le idee su un paio di cose il che è sicuramente utile :))
cmq il fatto rimane per i i multithread che non hanno questa possibilità
ciao
