Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 MSCOMM leeeeeeeeeeeeeeeento in trasmissione...

Creando il programmillo in calce, si nota (con un certo disappunto), che se 
il buffer di trasmissione e' piccolo (10) il form non subisce rallentamenti
visibili, infatti trascinandolo per lo schermo appare "normale".
Se si imposta un grande buffer (es. 1000) ,  il form "zoppica" durante
il trascinamento.
E' possibile impostare mscomm per fare in modo che la trasmissione
di grossi blocchi non generi rallentamenti ?
TIA.
--------------------------------------------------------------------------
Creare:
--------------------------------------------------------------------------
1 Form
2 command button
1 timer
1 mscomm
--------------------------------------------------------------------------
Codice:
--------------------------------------------------------------------------
Option Explicit
Private TxBuffer() As Byte
Private Sub Command1_Click()
Dim TimerStatus As Boolean
MSComm1.PortOpen = False
TimerStatus = Timer1.Enabled
Timer1.Enabled = False
If UBound(TxBuffer) = 1000 Then
     Command1.Caption = "Buffer a 10"
     ReDim TxBuffer(10)
     MSComm1.OutBufferSize = 10
  Else
     Command1.Caption = "Buffer a 1000"
     ReDim TxBuffer(1000)
     MSComm1.OutBufferSize = 1000
 End If
 MSComm1.PortOpen = True
 Timer1.Enabled = TimerStatus
 End Sub
Private Sub Command2_Click()
If Timer1.Enabled = True Then
   Timer1.Enabled = False
   Command2.Caption = "Fermo"
 Else
   Timer1.Enabled = True
   Command2.Caption = "In Corsa"
 End If
End Sub
Private Sub Form_Load()
Timer1.Enabled = False
Command1.Caption = "Buffer a 10"
ReDim TxBuffer(10)
Command2.Caption = "Fermo"
Timer1.Interval = 500
 With MSComm1
  If .PortOpen = False Then
    .OutBufferSize = 10
    .InBufferSize = 0
    .Settings = "19200,n,8,1"
    .RThreshold = 0
    .SThreshold = 0
    .RTSEnable = False
    .DTREnable = False
    .EOFEnable = False
    .CommPort = 1
    .Handshaking = comNone
    .PortOpen = True
   End If
 End With
End Sub
Private Sub Timer1_Timer()
 MSComm1.Output = TxBuffer
End Sub

 
[cut]
se ho capito bene quello che descrivi, la situazione e' normale.
quando il tuo controllo trasmette, tutte le altre operazioni (form refresh 
compreso) sono ferme fino al completamento della trasmissione.
tanti dati (buffer grande) = serve tanto tempo per trasmettere = 
interfaccia NON aggiornata per tanto tempo
anche se non mi e' del tutto chiaro se il tuo problema sia il refresh della 
maschera o la velocita' di trasmissione, visto che il subject dice una cosa 
e il testo un'altra...
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 dice una cosa e il testo un'altra...
Errore mio, cmq il problema e' che (fondamentalmente) fintanto che mscomm
non ha finito di trasmettere, non rilascia il controllo all'applicazione.
Il form che "scatta" e' la parte piu' tangibile del problema, ho incollato 
quel codice
in modo da ridurre all'osso le istruzioni necessarie per palesare il 
problema.
Per capirci:
- se stampo, c'e' uno spooler.
- se scrivo su disco, c'e' una cache disco.
e su mscomm ? devo arrendermi al fatto che mscomm se ne strafrega
del multitasking e mi blocca l'applicativo ? e allora, che me ne faccio del
buffer di trasmissione dimensionabile se (nel concreto) impostarlo a zero, 1
o 10000 non cambia nulla (l'applicativo e' bloccato fintanto che il buffer
non si e' svuotato) ?
ci sto' uscendo pazzo... in succo, non c'e' un modo per dire alla seriale di
trasmettere come se (paragone azzardato) fosse  una trasmissione UDP ?
una sorta di buffer fifo, in modo che non mi causi mai rallentamenti
nell'applicativo ?

nell'applicativo ?
Si, MsComm non � un servizio come lo spooler e tende a tenere l'applicazione in
uso se deve trasmettere.
Un'alternativa potrebbe essere fare un servizio di Windows e lasciare gestire a
lui la comunicazione, ma non � semplicissimo e bisogna spippolare con le api.
Un altra strada potrebbe essere usare qualcosa d'altro al posto di MsComm, avevo
dato un'occhiata a questo tempo fa ma poi non l'ho provato a fondo:
http://wareseeker.com/Software-Development/arachnoware-scomm-3.1.zip/384595
non mi assumo responsabilit�.
--
ciao
  Stefano

 non mi assumo responsabilit�.
Of course :)  grazie, comunque :) 

> 
http://wareseeker.com/Software-Development/arachnoware-scomm-3.1.zip/384595
Abortito...
.. il sito sviluppatore e' defunto e il solo installer richiede .net 1.4xyz, 
il .msi
non e' "apribile".

Franz_aRTiglio wrote:

Hai ragione, non va e questo spiega perch� avevo cancellato il file .msi, forse
mi confondevo con qualcos'altro
L'avevo tra i link, come questi del resto:
http://www.thescarms.com/vbasic/commio.aspx
http://www.programmersheaven.com/download/30080/download.aspx
vedi se ti possono servire,
--
ciao
  Stefano

 vedi se ti possono servire,
Tnx, avevo trovato anche io quello con le API, vediamo se mi
pungo o ci cavo fuori qualcosa....



scusa un attimo, e se modifichi la tua applicazione implementando una
classe in multithread, almeno per la gestione di mscomm dovresti
risolvere tutti i problemi.
ciao

 risolvere tutti i problemi.
hem...
un esempio ?
Grazie anticipate.



l'exe deve essere axtivex, nella proprieta' imposti l'opzione thread per
oggetto e la classe che andra' in multithread deve essere multiuse 
per il tuo esempio ti servono 2 form e la classe:
un form dell'applicazione come interfaccia e l'altro come oggetto
privato della classe che lavorera' in multithread con dentro mscomm e
timer.
alla classe fai esporre tutte le proprieta' necessarie, compreso
l'enable per il timer che poi sara' l'interruttore del oggetto.
unica accortezza devi instanziare l'oggetto(la classe) con la funzione
createobject() e non con l'operatore new
ps
nell'IDE il multithread non funziona, sara' sempre un esecuzione a
thread singolo, ma come farai girare l'eseguibile vedrai che funziona a
meraviglia ;-)