Newsgroup: it.comp.lang.visual-basic
Titolo: thread e DLL

Salve a tutti,
  ho una mia dll (fatta in VC) in cui c'e' una funzione (FUNZ) che
viene richiamata da del codice in VB. Poiche' tale funzione fa dei
calcoli abbastanza impegnativi per la macchina, se la richiamo
"normalmente" la mia applicazione Vb resta piantata fiche' la funzione
non giunge a termine. Allora ho pensato di creare un thread (con l'API
CreateThread) che richiama una funzione nella quale si invoca la
funzione FUNZ nella DLL.
Il problema e' che tutto funziona per bene (nel senso che mentre la
mia DLL elabora, il programmino continua a processare i suoi eventi)
finche' la funzione nella DLL non giunge a termine. Appena termina mi
compare un errore. Cliccando su Dettagli ecco quello che esce:
-----------
FUNZ ha provocato un errore di pagina non valida nel
modulo MSVBVM60.DLL in 0177:660d63c0.
Registri:
EAX=00000000 CS=0177 EIP=660d63c0 EFLGS=00010283
EBX=00000008 SS=017f ESP=02e1ff90 EBP=02e1ffcc
ECX=00000005 DS=017f ESI=00000000 FS=4707
EDX=81746194 ES=017f EDI=8174618c GS=0000
Byte all'indirizzo CS:EIP:
89 b0 9c 00 00 00 5e c3 56 66 8b 74 24 08 66 85 
Immagine dello stack:
00000001 0041d6b2 81742ee8 bff88ef7 00000000 8174618c 81742ee8
00000008 00000007 02e1ffa4 02e1fdc0 ffffffff bffbfe14 bff79050
00000000 02e1ffec 
-----------
Dove sbaglio ?
(Preciso che la DLL funziona regolarmente se non richiamata in un
thread).
Grazie in anticipo a chiounque mi risponda. 

 compare un errore.
L' uso di CreateThread in vb e' una strada in salita, sia per la
sua implementazione in se' (tra l' altro, ci sono differenze di 
comportamento tra vb5, che va meglio, e vb6).
Con 
vb.net
 sara' decisamente meglio, anche se i form saranno
ancora single-threaded apartment).
Fossi in te, proverei a creare il thread dalla dll C.
-- 
ciao, hal
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

> Fossi in te, proverei a creare il thread dalla dll C.
o magari da un activex multithread
bye :))

o magari da un activex multithread
Non e' proprio la stessa cosa. Il problema di Workobbit e' _creare_
il thread, oltre ad eseguirvi il codice, ed il client e' un programma vb
(quindi monothread).
Se utilizzasse un' activex exe addirittura dovrebbe sobbarcarsi il
marshaling con un altro processo. Ma, allora, magari tanto varrebbe 
compilarsi la dll come exe (ipotizzo, perche' non si sa cosa faccia
di preciso la dll).
-- 
ciao, hal

 marshaling con un altro processo.
si va beh ma non è un motivo per non farlo...i thread in vb si usano solo in
quel modo non puoi fare altrimenti per chiamare le funzioni della dll.
c'è anche il fatto che vb non puo chiamare un metodo e poi continuare
l'esecuzione del "proprio" thread e rimarrebbe cmq chiuso nel thread
dell'activex...bisognerebbe chiamare il metodo tramite l'attivazione di un
timer che renderebbe la chiamata asincrona...
ciao :))

timer che renderebbe la chiamata asincrona...
Appunto, troppi rigiri per fare una cosa che in C/C++ e' piu' pulita.
-- 
ciao, hal

timer che renderebbe la chiamata asincrona...
Appunto, troppi rigiri per fare una cosa che in C/C++ e' piu' pulita.
-- 
ciao, hal

Fossi in te, proverei a creare il thread dalla dll C.
Mi sa che provero' cosi'.
Spero di riuscirci.
Grazie.