Newsgroup: it.comp.lang.visual-basic
Titolo: put # in background

ciao a tutti,
sto scrivendo perche' ho il seguente problema:
la mia applicazione scarica molti dati da una scheda di acquisizione, che
vengono
scritti in un array di bytes, il quale viene poi copiato su un file con
l'istruzione Put #outfileNumber, , oscdata
Dato che si tratta di qualche migliaio di bytes, vorrei poter procedere con
l'esecuzione del mio programma, mentre l'istruzione put copia l'array
in background. Occorrebe poi un controllo per cui l'array non venga
sovrascritto al ciclo seguente prima di aver terminato il dump sul disco
rigido.
Credo che si risolva con uan thread ma non ho esperienza in materia ....
Qualcuno mi sa aiutare, magari con qualche riga di esempio ?
grazie molte
Franco

Prova a usare doevents nel ciclo in cui leggi i dati.
Quanto al multi thread ti consiglio di lasciar stare, alcuni dicono che con
Vb si puo fare applicazioni multithread, secondo me e' una bugia grande e
grossa (na' palla insomma).
Per fare un'applicazione multithread ti tocca scrivere una dll o un ActiveX
che gestisca l'altro thread, usando Vc o simili.
Salve
                Dbg
franco spinella ha scritto nel messaggio ...
]zac[


 che gestisca l'altro thread, usando Vc o simili.
Eseguibili e DLL ActiveX li puoi scrivere tranquillamente in VB e sono
multithreaded...
Per quanto riguarda il problema specifico, una soluzione non troppo elaborata
puo' essere quella di spostare la scrittura del file in un Timer per rendere
l'operazione asincrona; ad esempio prova a creare un Form con una Label, un
Command e un timer e incollare questo codice:
Private Sub Command1_Click()
Dim i As Long
For i = 0 To 100000
    If (i Mod 1000) = 0 Then Timer1.Enabled = True
    Label1 = i
    DoEvents
Next
End Sub
Private Sub Form_Load()
Timer1.Interval = 100
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
Dim arBytes(50000) As Byte
'disabilitiamo subito il timer per
'evitare esecuzioni indesiderate.
Timer1.Enabled = False
Open "c:\temp.bin" For Binary As #1
Put #1, , arBytes
Close #1
End Sub
Ciao
--
Luca Dormio
luca....@tin.it

 che gestisca l'altro thread, usando Vc o simili.
Eseguibili e DLL ActiveX li puoi scrivere tranquillamente in VB e sono


multithreaded...
]zac[

 (non e' che e' impossibile, e' ingestibile).
Se vuoi fare molte cose in maniera asincrona e' possibile, piu' che altro per la
gestione degli eventi "timer" in maniera generalizzata, ma per quello che ho
duvuto fare finora a me va bene; se ti interessa posso mandarti un paio di
progetti che ho fatto in due righe con un componente che esegue un metodo
asyncrono in un thread separato...


asyncrono in un thread separato...
]zac[

 ocx di appoggio scritto in Vc.
Questo non lo metto in dubbio, ma non vuol dire che non si possano fare
componenti multithreaded in assoluto.



Qui mi inserisco da profano, piuttosto che da profeta :-P
Ma il passaggio di un bel bloccone di byte (come nel caso di Franco) ad un 
altro processo via COM non potrebbe risentirne in termini di prestazioni e 
quindi riproporre il problema iniziale ?
Domando cosi' perche' non ho mai provato, magari qualcuno di voi ci ha gia'
sbattuto contro.
Ciao
Aldo

 sbattuto contro.
Dipende da quanto e' grande il bloccone... comunque sicuramente si; il problema
iniziale di Franco in ogni caso non mi sembrava di prestazioni quanto di non
bloccare il programma durante la scrittura, in questo caso non c'e' bisogno di
fare necessariamente un componente esterno; e' sufficiente ritardare
l'esecuzione con un timer oppure con una classe interna che esegua la scrittura
asincrona (sempre con qualche tipo di timer).
Giusto per curiosita' ho fatto una prova creando un ActiveX che prende in input
un array di byte e un client che richiamava tale metodo 5000 volte (su un PII
233):
Array da 50.000 elementi e late binding: 22 sec.
Array da 50.000 elementi e early binding: 15 sec.
Array da 10 elementi e late binding: 8 sec.
Array da 10 elementi e early binding: 3 sec.


Grazie hal.
Questo intendevo, in Vb devi usare dei trucchi che rendono ingestibile la
cosa, il multithread (girano nello stesso processo) e' una cosa
completamente diversa, che si possa simulare (con pesantezze varie) usando
DDE, OLE2, COM, DCOM, non lo metto in dubbio, ma un prezzo spesso alto.
Salve
                Dbg
hal1961 ha scritto nel messaggio
