Eseguo dei ping su alcuni indirizzi IP.
Voglio che si ritorni ad ogni routine solo quando quella chiamata sia effettivamente terminata, per cui uso dei Wait For
Ma la sequenza delle routine, che controllo con appositi Log, non è quella che mi aspetterei
Allego il codice di esempio, depurato quanto piu possibile di cose non necessarie alla risoluzione del problema.
La sequenza che mi aspetterei (supponiamo che siano due impianti da testare) dovrebbe essere
"************** INIZIO TEST IMPIANTI PERIFERICI *********** " )
Inizio CheckImpiantoPeriferico
Inizio Risponde
Inizia ConnessionePing
Fine ConnessionePing
Fine Risponde
Fine CheckImpiantoPeriferico
Inizio CheckImpiantoPeriferico
Inizio Risponde
Inizia ConnessionePing
Fine ConnessionePing
Fine Risponde
Fine CheckImpiantoPeriferico
************** FINE TEST IMPIANTI PERIFERICI ***********
Invece è:
"************** INIZIO TEST IMPIANTI PERIFERICI ***********
Inizio CheckImpiantoPeriferico
Inizio Risponde
Inizia ConnessionePing
Fine ConnessionePing
Inizio CheckImpiantoPeriferico
Inizio Risponde
Inizia ConnessionePing
Fine ConnessionePing
************** FINE TEST IMPIANTI PERIFERICI ***********
Fine Risponde
Fine Risponde
Fine Risponde
Fine CheckImpiantoPeriferico
Fine CheckImpiantoPeriferico
Fine CheckImpiantoPeriferico
Perchè, dopo ConnessionePing il codice non torna a Risponde che è la sub che ha lanciato ConnessionePing?
Voglio che si ritorni ad ogni routine solo quando quella chiamata sia effettivamente terminata, per cui uso dei Wait For
Ma la sequenza delle routine, che controllo con appositi Log, non è quella che mi aspetterei
Allego il codice di esempio, depurato quanto piu possibile di cose non necessarie alla risoluzione del problema.
La sequenza che mi aspetterei (supponiamo che siano due impianti da testare) dovrebbe essere
"************** INIZIO TEST IMPIANTI PERIFERICI *********** " )
Inizio CheckImpiantoPeriferico
Inizio Risponde
Inizia ConnessionePing
Fine ConnessionePing
Fine Risponde
Fine CheckImpiantoPeriferico
Inizio CheckImpiantoPeriferico
Inizio Risponde
Inizia ConnessionePing
Fine ConnessionePing
Fine Risponde
Fine CheckImpiantoPeriferico
************** FINE TEST IMPIANTI PERIFERICI ***********
Invece è:
"************** INIZIO TEST IMPIANTI PERIFERICI ***********
Inizio CheckImpiantoPeriferico
Inizio Risponde
Inizia ConnessionePing
Fine ConnessionePing
Inizio CheckImpiantoPeriferico
Inizio Risponde
Inizia ConnessionePing
Fine ConnessionePing
************** FINE TEST IMPIANTI PERIFERICI ***********
Fine Risponde
Fine Risponde
Fine Risponde
Fine CheckImpiantoPeriferico
Fine CheckImpiantoPeriferico
Fine CheckImpiantoPeriferico
Perchè, dopo ConnessionePing il codice non torna a Risponde che è la sub che ha lanciato ConnessionePing?
B4X:
'In un modulo chiamato GL
'====================================================================================================
Public oConn As clsConnessione '
Public Sub Log1(testo As String) 'ignore
'Log di debug che aggiunge i secondi per controllare dopo quanto tempo avviene l'istruzione
Log(testo & " - " & DateTime.TIME(DateTime.Now))
End Sub
'====================================================================================================
'in una pagina B4xMainPage
'====================================================================================================
Sub Test_Impianti_Periferici (Tutti As Int)
GL.Log1("************** INIZIO TEST IMPIANTI PERIFERICI *********** " )
For Each oImpianto As Impianto In GL.lstImpianti
CheckImpiantoPeriferico (oImpianto, Tutti)
Next
GL.Log1("************** FINE TEST IMPIANTI PERIFERICI *********** " )
End Sub
Sub CheckImpiantoPeriferico(oImpianto As Impianto,Tutti As Int)
GL.Log1("Inizio CheckImpiantoPeriferico")
Wait For (GL.oConn.Risponde(oImpianto.IP_PLC,"ping") ) complete (EsitoRispPLC As Boolean)
GL.Log1("Fine CheckImpiantoPeriferico")
End Sub
'====================================================================================================
'nella classe "clsConnessione"
'====================================================================================================
Public Sub Risponde(IndirizzoCompleto As String, TipoConness As String) As ResumableSub
GL.Log1("Inizio Risponde")
Dim EsitoRisp As Boolean
Wait For (ConnessionePing) complete (EsitoRisp As Boolean)
GL.Log1("Fine Risponde")
Return EsitoRisp
End Sub
Private Sub ConnessionePing() As ResumableSub
GL.Log1("Inizio ConnessionePing")
Dim result As Boolean
Dim p As Phone
Dim sbStatus, sbErrors As StringBuilder
Dim Percentage As String 'ignore
sbStatus.Initialize
sbErrors.Initialize
p.Shell("ping -q -c 1 -w " & 2 & " " & mSoloIP, Null, sbStatus, sbErrors)
Dim s As String = sbStatus.ToString
Dim IndexOfReceived As Int = s.IndexOf("received,")
Dim IndexOfPacketLoss As Int = s.IndexOf("packet loss,")
If s.Length > 0 Then
Percentage = s.SubString2((IndexOfReceived + 9), IndexOfPacketLoss - 1).Trim
End If
If sbStatus.Length = 0 Then
result=False
Else
If sbStatus.ToString.Contains("100% packet loss") Or sbErrors.Length>0 Then
result=False
Else
result=True
End If
End If
GL.Log1("Fine ConnessionePing")
Return result
End Sub
'====================================================================================================