Newsgroup: it.comp.lang.visual-basic
Titolo: Thread in VB6

Ciao a tutti.
Ho creato un progetto exe in VB6 che utilizza un ActiveX DLL
Questa dll ha una proprietà Test di tipo integer. Per mantenere il valore di
tale proprità nella dll ho aggiunto un modulo bas con una variabile pubblica
di tipo integer.
In una routine dell'exe scrivo:
Dim A AS NEW clsDLL
Dim B AS NEW clsDLL
A.TEST = 1
B.TEST = 2
vorrei sapere perchè a questo punto A.TEST  e B.TEST hanno entrambe valore
2.
Se ho creato A e B con NEW non dovrei avere valori diversi? (cioè A.TEST=1 e
B.TEST =2)
In effetti debuggando il progetto si nota che quando assegno B.TEST=2 nella
proprietà della dll il valore della variabile pubblica dichiarata nel modulo
bas contiene già il valore passato ad A.TEST. Io mi aspettavo di avere 0 ed
invece è già 1.
Ho controllato la proprietà ThreadID ed è uguale per entrambe. Ciò vuol dire
che VB utilizza lo stesso thread per entrambi gli oggetti, condividendo
quindi le variabili pubbliche.
Come posso fare per avere valori diversi per la stessa proprietà da istanze
diverse della stessa classe?
Grazie mille in anticipo per l'aiuto e buone vacanze (per chi le fa)
Ciao
Maurizio


ciao,
A.
UGIdotNET - 
http://www.ugidotnet.org

 funzionare...ri-posta! :-)
Già fatto ma non cambia nulla.
Comunque grazie per la risposta.
Ciao

 di tipo integer.
Non ho capito... dichiari una var in un modulo per condividerla e poi
denunci il fatto che è condivisa?
Ovvio che se la var è usata sia da A che da B avrà il valore in comune.
Ciao
--
y = f(
http://neodatatype.interfree.it/index.html
)

 diverse della stessa classe?
Non e' tanto un problema di thread, ma di concetto:
Avere valori diversi per istanze diverse di classe e' il comportamento
normale; il punto pero' e' che "la regola" vorrebbe che i valori delle
proprieta' di una classe siano mantenuti in variabili *a livello di classe*,
non di modulo
Dato che un modulo BAS viene istanziato(caricato) una sola volta per tutta
la vita del programma, quello che in effetti ottieni e' di rimappare la
property TEST di tutte le possibili istanze di clsDLL ad un unico valore
condiviso.
La soluzione, semplicemente, e' di spostare quella variabile all'interno di
clsDLL; puoi inoltre definirla come privata, poiche' l'accesso avviene
tramite le routine Property pubbliche
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 2.
Come ti ha già spiegato Luca Dormio puoi ovviare al problema dichiarando una
variabile privata a livello di modulo per contenere il valore della
proprietà.
Ma perché se dichiari la variabile in un modulo .bas il valore viene
condiviso?
Perché entrambi gli oggetti vengono istanziati nel medesimo Apartment e
quindi condividono la stessa area di memoria globale.
Prova a leggere
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon98/htm
l/vbconapartmentmodelmultithreadinginvisualbasic.asp
--
Lorenzo Benaglia
UGIdotNET - 
http://www.ugidotnet.org

 Ciao


 da istanze diverse della stessa classe?
uh? serve un'infarinatura di programmazione OO, forse? usa una 
variabile globale privata dentro la classe
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!

 variabile globale privata
Ossimoro?


 Ossimoro?
non č colpa mia se l'OO di VB fa schifo :-) in situazioni normali 
l'avrei chiamato un campo privato


variabile privata alla classe.
Giustissimo.
In effetti nel piccolo esempio da me postato sarebbe il modo + semplice per
sistemare le cose
ma in alcuni casi una soluzione simile potrebbe non risolvere le cose.
Ad esempio come dovrei comportarmi se il valore di quella variabile dovresse
essere visibile dall'interno di un form?
Un form che naturalmente faccia parte della DLL.
Alla fine, comunque, ho risolto le cose modificando la DLL in un ActiveX
EXE.
Questo permette di modificare il modello di threading utilizzato e di
impostarlo su "Thread per oggetto"
Nel progetto ho dichiarato 2 variabili come object ed ho creato l'oggetto
tramite CreateObject:
Dim A as Object
Dim B as Object
Set A = CreateObject(prjEXE.clsDLL)
Set B = CreateObject(prjEXE.clsDLL)
In questo modo le cose funzionano correttamente ed è provato dal fatto che i
valori di ThreaID sono diversi.
Ora però mi sorge un'ulteriore problema.
Scrivo questa domanda + che altro per curiosità ed interesse nel discorso.
Il progetto ActiveX EXE contiene una routine Sub utilizzata per subclassare
un form.
Qui evito di entrare nei dettagli.
Ecco il codice della Sub:
Sub SubClassWin(hwnd as Long)
 WP = SetWindowLong(hwnd, GWL_WNDPROC, AddressOF MyWndProc)
End Sub
Come vedete l'API utilizzata è SetWindowLong a cui viene passato l'handle di
un form.
Inoltre l'utilizzo di AdressOF fa si che venga richiamata la funzione
MyWndProc per l'intercettazione dei messaggi.
Dal momento in cui la funzione ha iniziato a lavorare in un thread diverso
ha smesso di funzionare.
Cioè la funzione MyWndProc non viene mai richiamata.
Forse perchè facendo parte di un thread diverso la funzione non riesce a
vedere l'oggetto a cui punta l'handle passato?
Grazie mille a tutti.
Ciao
Maurizio

 un form. .... [cut]
come giustamente supponi, questo funziona solo con una DLL, perche'
la WinProc deve essere nello stesso processo.
HTH
bye
R

 Maurizio


 l'avrei chiamato un campo privato
Sara'...
ma in VB una variabile dichiarata in un modulo di classe e' e puo' essere
tranquillamente definita un campo privato senza che ci siano "forzature" di
nessun tipo.
il "globale" invece qui mi sembra messo a sproposito... se poi il
compilatore fa le peggio schifezze dietro le quinte, questo non lo so.


ti sconsiglio di continuare ad usare un ActiveX
Concordo, se per ActiveX intendevi ActiveX-exe.
Ciao

 Ciao


Visto che siete cosi gentili vorrei chiedervi un'ultima cosa.
Avendo solo come riferimento l'handle di un form è possibile recuperare il
valore di una sua variabile pubblica?
Grazie ancora per tutto l'aiuto che mi avete dato.
Ciao
Maurizio

 valore di una sua variabile pubblica?
Non credo... ma prova a spiegare il contesto del problema, non la soluzione
che vorresti adottare.
Ciao