Anche se AntoAnto, non ha fatto sapere, un mio contributo che simula l'effetto condensatore elettrolitico.
Nel form vanno inserite tre progressbar
Public Class Form1
Dim rnd = New Random(Now.Millisecond)
Dim WithEvents Timer1 As New Timer
Dim valore As Integer
Dim Valori(9) As Integer ' buffer da 10 posti
Dim ValoriIdx As Integer = 0
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ProgressBar1.Minimum = 0
ProgressBar1.Maximum = 200
ProgressBar2.Minimum = 0
ProgressBar2.Maximum = 200
ProgressBar3.Minimum = 0
ProgressBar3.Maximum = 200
Timer1.Interval = 100 ' variare per il miglior effetto
Timer1.Enabled = True
' Thread separato per generazione random
Dim vThread As New System.Threading.Thread(AddressOf valorerandom)
vThread.Start()
End Sub
' lettura ciclica della variabile valore
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
' Per fare In modo che tutte le barre lavorino con lo stesso valore
' salvo valore in comune.
' Perché valore viene aggiornato da un thread separato.
' non servirà nel programma definitivo, dove ci sarà una barra unica
Dim comune As Integer = valore
ProgressBar1.Value = comune ' PICCHI
ProgressBar2.Value = MediaValore(comune) ' MEDIA
' effetto elettrolitico ------------------------
If ProgressBar3.Value > comune Then
Dim scarica As Integer = 6 ' 6 determina la scarica,
' un valore più alto, scarica più veloce
' il valore va tararo in rapporto a Timer1.Interval
ProgressBar3.Value -= scarica
Else
ProgressBar3.Value = comune
End If
'-----------------------------------------------
End Sub
' codice calcolo media SirJo, Weierstrass
Private Function MediaValore(ByVal num As Integer) As Integer
Valori(ValoriIdx) = num ' memorizza il valore nel buffer
ValoriIdx += 1 ' avanza il puntatore
If ValoriIdx = 10 Then ValoriIdx = 0 ' riporta il puntatore all'inizio
' calcola la media
Dim somma As Integer = 0
For Each valore In Valori
somma += valore
Next
Return CInt(somma / Valori.Length)
End Function
' simula un device su thread indipendente che spara dati sulla variabile valore
Private Sub valorerandom()
Do
valore = rnd.Next(0, 201) ' numero casuale da 0 a 200
System.Threading.Thread.Sleep(250) ' un valore ogni 250ms
Loop
End Sub
' chiude tutti i thread alla chiusura del form
Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
End
End Sub
End Class