Sto realizzando un programma che gestisca la connessione ad un dispositivo mediante bluetooth. Quando spengo tale dispositivo il software lo riconosce, e cerca di rilasciare la porta COM associata. L'operazione però può durare parecchio, fino a 20 secondi, e quindi volevo inserire un form con una progressbar che avanza (casualmente), solo per far capire all'utente che il programma non si è bloccato.
In un modulo ho scritto:
- Codice: Seleziona tutto
formMessaggi.mtd_avviaProgressBar(2)
formMessaggi.Refresh()
Com.mtd_disconnettiTma()
Dove formMessaggi è appunto il form che apro, contenente la progress bar.
Com.mtd_disconnettiTma() è invece la procedura che scollega la com, e che causa il "blocco" del programma.
Questo è quello che succede nella procedura avviaProgressBar:
- Codice: Seleziona tutto
Public Sub mtd_avviaProgressBar(tempo As Integer)
tempoPb = tempo
t.Start()
t.Priority = Threading.ThreadPriority.Highest
End Sub
mentre queste variabili sono dichiarate appunto nella formMessaggi:
- Codice: Seleziona tutto
Public Delegate Sub delegateSetPb(ByVal val As Integer)
Dim istanzaDelSetPb As New delegateSetPb(AddressOf setProgressBarValue)
Dim t As New System.Threading.Thread(AddressOf incrementaPB)
Quindi infine questo è il codice relativo all'incremento della progressbar.
- Codice: Seleziona tutto
Public Sub incrementaPB()
Dim val As Integer = 0
Do While Pb.Value < 100
val = val + 1
Me.Invoke(istanzaDelSetPb, val)
Threading.Thread.Sleep(tempoPb * 10)
Loop
End Sub
Public Sub setProgressBarValue(ByVal val As Integer)
Pb.Value = val
End Sub
dove Pb è la progressBar stessa.
Io mi aspetto cosa, che il software si disconnetta tranquillamente dalla com con la procedura Com.mtd_disconnettiTma(), e che nel frattempo continui ad entrare nel ciclo dell'incrementa Pb.
Invece no!! Ho provato ad eseguire passo passo un istruzione per volta in debug, e succede che mi entra una volta nel ciclo, raggiunge l'istruzione
- Codice: Seleziona tutto
Me.Invoke(istanzaDelSetPb, val)
dopodichè,se provo ad avanzare uno step, il cursore di debug sparisce, e riappare solo dopo che è terminata la disconnessione dal sensore.
Non so se mi sono spiegato... è come se l'istruzione
- Codice: Seleziona tutto
Me.Invoke(istanzaDelSetPb, val)
sospendesse il thread, e aspettasse la fine della disconnessione per continuare.
Il che però ha gran poco senso, considerando che io ho creato 2 thread proprio per poter far procedere le 2 cose in parallelo.
Qualcuno sa come aiutarmi?