Per risolvere un mio precedente problema (simulare un led che lampeggia) mi era stato suggerito di ricorrere a delegate e thread paralleli. Non essendo proprio un'aquila con quegli argomenti ed avendo altre priorità da risolvere, ho accantonato per un po' il problema.
Ora lo sto riaffrontando, ma mi trovo di fronte a qualche ostacolo che non saprei affrontare.
La soluzione adottata:
Dichiaro il delegate:
Private delegate sub BlinkLed(byval P1 as Uinteger, P2 as Uinteger)
Dichiaro una variabile di controllo del ciclo:
Private RunThread as boolean=False
dichiaro un Thread:
Private ThreadBlink as Threading.Thread
La Routine di lampeggio (che sarà chiamata dal delegate):
PrivateSub Blinking(ByVal Vl AsUInt16, ByVal V2 AsUInteger)
Try
'la variabile V2 non fa nulla, è presente solo per completezza del progetto
If Vl = 0 Then
LedGreen.Visible = False
LedRed.Visible = True
Application.DoEvents()
Else
LedGreen.Visible = True
LedRed.Visible = False
Application.DoEvents()
EndIf
Catch ex AsException
MessageBox.Show("Errore Blinking")
EndTry
EndSub
La Routine Delegate:
PrivateSub DelBlink(V1 AsUint16r, V2 AsUint16)
'Anche qui le variabili sono poco più che dei segnaposto, servono per l'esempio
Dim V AsUInteger = V1
Try
DoWhile RunTh
Me.Invoke(NewBlinkLed(AddressOf Blinking), V, V2)
Threading.Thread.Sleep(150)
V = 0
Me.Invoke(NewBlinkLed(AddressOf Blinking), V, V2)
Threading.Thread.Sleep(150)
V = 1
Loop
Catch ex AsException
MessageBox.Show("ERRORE DelBlink")
EndTry
EndSub
La chiamata di un nuovo thread che per comodità è legata ad un bottone premuto:
PrivateSub Button1_Click(sender AsObject, e AsEventArgs) Handles Button1.Click
Try
RunThread = Not RunThread
If RunThread Then
ThreadBlink = New Threading.Thread(AddressOf DelBlink)
ThreadBlink.Start()
EndIf
Catch ex AsException
MessageBox.Show("Errore Bottone")
EndTry
EndSub
Il Problema:
Se il delegate DelBlink non prevedesse alcun parametro tutto funzionerebbe (ovviamente anche "a valle" non ci sarebbero i relativi parametri).
Viceversa coi parametri non so dove caspita indicarli: se non li metto (come nell'esempio) e mi riservo di fornirli con il metodo Start ottengo un errore "Risoluzione dell'overload non riuscita perché nessun 'New' accessibile può essere chiamato con questi argomenti"
Se li indico come si fa normalmente per una chiamata ad una routine
ThreadBlink = New Threading.Thread(AddressOf DelBlink(Parametro,parametro2))
Ottengo l'errore per cui "L'operando AddressOf deve essere il nome di un metodo, senza parentesi"
Non mi è chiaro come debbo comportarmi e dal supporto Microsoft non sono riuscito a capire alcunché.
Qualcuno mi saprebbe guidare per cortesia?
Grazie a tutti
Beppe