Newsgroup: it.comp.lang.visual-basic
Titolo: Thread; aiutatemi!!!

Ciao!!
Sto cercando di fare un programma multithread con il visual basic 6.0 ma
nonso bene come fare.
Ho provato ad usare, con scarso successo, le API di Windows(CreateThread).
Qualcuno sa dove trovare qualche esempio, anche banale, di uso di thread con
il Visual Basic?
Grazie mille!! Ciao!

Dovresti essere un po' più specifico...
Intanto dai un'occhiata a questo:
Ingenious Ways to Implement Multiple Threads in Visual Basic 5.0, Part I
http://msdn.microsoft.com/library/periodic/period97/periodic/msj/thread897.h
tm
Saluti
Luciano Fiandesio
Simone Monica wrote in message ...


 Grazie mille!! Ciao!
Incredibile: è almeno la terza volta in un mese che inizio a fare qualcosa di
strano in VB, trattenendomi dal fare domande (per sfida con me stesso...) e per
magia compare qualche messaggio a proposito.
Uau! (per gli anglofili, Wow!)
Questo è quel che ho scoperto che NON si può fare:
- Debuggare anche solo una riga nell'IDE di VB: bisogna compilare in codice
nativo e lanciare l'exe, pena crash a volontà
- Compilare il progetto in P-Code
- Far eseguire alla callback qualsiasi cosa che abbia a che fare con la GUI
- Passare certi argomenti come lpParameter alla callback (es. un controllo)
- Indicare metodi di una classe come CallBack (ovvio)
- Eseguire metodi di una classe istanziata altrove con WithEvents (meno ovvio,
ma più fastidioso)
- Ritornare da una funzione senza richiamare ExitThread (non sempre vero, ma
così si dice, e forse è proprio meglio)
- Fare uso di DLL diverse da MSVBVM60.DLL (e non thread-safe)
C'è un po' di documentazione in MSDN, cercando con "CreateThread Visual Basic".
Però l'esempio che ho trovato non funziona. Infatti, fa uso di MsgBoxes per
testare il thread, peccato che non si possono usare. E qui sto impazzendo:
perché all'autore funzionano? Solo perché usa VB5? Non credo.
Io sono riuscito a fare qualcosa dichiarando CreateThread come segue:
'Dicharazione modificata rispetto a quella standard, per poter passare argomenti
non necessari come Null.
Public Declare Function CreateThread Lib "kernel32" _
        (ByVal lpThreadAttributes As Long, _
        ByVal dwStackSize As Long, _
        ByVal lpStartAddress As Long, _
        ByVal lpParameter As Long, _
        ByVal dwCreationFlags As Long, _
        ByRef lpThreadID As Long) As Long
In questo modo posso passare alla CallBack un Long per valore. La CallBack è
definita come segue:
Public Sub CALLBACK_THREAD(ByVal lpParameter As Long)
    'Istruzioni...
    '...
    'Call ExitThread
End Sub
Per passare vari argomenti per riferimento si può creare un UDT, dichiarando, in
questo caso, lpParameter come UDT ByRef:
Private Type MIO_TIPO
    Variabile1 As Quelchemipare
    Variabile2 As Quelchepareate
End Type
Public Declare Function CreateThread Lib "kernel32" _
        (ByVal lpThreadAttributes As Long, _
        ByVal dwStackSize As Long, _
        ByVal lpStartAddress As Long, _
        ByRef lpParameter As Any, _
        ByVal dwCreationFlags As Long, _
        ByRef lpThreadID As Long) As Long
Public Sub CALLBACK_THREAD(ByRef lpParameter As MIO_TIPO)
    'Istruzioni...
    '...
    'Call ExitThread
End Sub
(Negli esempi manca la dichiarazione di ExitThread)
L'esecuzione del thread avviene tramite:
Dim rc As Long
Dim lValue As Long
Dim lpTrheadID As Long
lValue = 1111 'Valore di esempio
rc = CreateThread(0&, 0&, AddressOf CALLBACK_THREAD, lValue, 0&, lpTrheadID)
Ovviamente, il programma prosegue in asincrono dopo aver lanciato il thread.
Altra cosa ovvia: la CallBack deve risiedere in un modulo standard (.bas).
Ci sarebbe moltissimo da dire, ma credo che il concetto più importante sia
questo: una CallBack può essere condivisa da tutti i thread che ne ricevono
l'indirizzo. E ogni thread può utilizzare in qualunque momento il codice ivi
contenuto, modificando variabili globali. Attenzione quindi nella gestione di
variabili globali coinvolte nell'algoritmo della CallBack, visto che un thread
potrebbe ritrovarsi queste variabili cambiate (per esempio di ritorno da una
chiamata di funzione particolarmente lunga, durante la quale altri thread della
stessa CallBack siano stati lanciati).
Si possono utilizzare i metodi standard API di sincronismo tra thread, ad
esempio WaitForMultipleObjects, oppure mantenere flags in variabili globali (con
le restrizioni di cui sopra).
Fammi sapere se riesci a tessere qualche filo...
Ciao
Flavio Ronco
--
f.ronco@*NonMiServeNiente*
flashnet.it
http://www.metabrains.com
  [Under Construction]
-------------------------------------------------------------
"Che pubblico in gamba! Se ci dite dove lavorate,
domani mattina se abbiamo tempo vi veniamo a vedere"
[Paolo Rossi]

 perché all'autore funzionano? Solo perché usa VB5? Non credo.
Ora invece ci credo: in VB6 son cambiate le carte in tavola! Per scoraggiare l'uso
di CreateThread.
Da' un'occhiata qui:
http://www.desaware.com/cgi-bin/articles.asp#VB6
 Info
e qui:
http://support.microsoft.com/support/kb/articles/q198/6/07.asp
Pare che si possa fare qualcosa creando una Type library e eliminando tutti i
Declare. Ci sto provando, ma credo che sia meglio abbandonare l'idea e rassegnarsi a
creare una DLL ActiveX di supporto. Quella si può compilare come multithread. Solo
che io volevo una cosa di puro codice...
