Italian [RISOLTO] Sequenza del codice di Wait For

Sabotto

Active Member
Licensed User
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?
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
'====================================================================================================
 

LucaMs

Expert
Licensed User
Longtime User
B4X:
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

Non sono ancora sveglio (!) ma il motivo potrebbe essere che anche la routine sopra è una Resumable, dato che contiene un Wait For, e tu la chiami N volte direttamente, senza usare Wait For.
 

Sagenut

Expert
Licensed User
Longtime User
Io credo che l'errore sia quì
B4X:
For Each oImpianto As Impianto In  GL.lstImpianti
    CheckImpiantoPeriferico (oImpianto, Tutti)
Next
Serve che le chiamate siano con Wait For altrimenti partono tutte a raffica.
 

Sagenut

Expert
Licensed User
Longtime User
Abbiamo risposto in contemporanea. 🤣 🤣 🤣
Anzi... @LucaMs 18 minuti prima di me ma io non avevo ricevuto la notifica.
 

Sabotto

Active Member
Licensed User
Provo e vi fo sapere.
Aiuto!!! Con che sintassi la chiamo con Wait For la CheckImpiantoPeriferico (oImpianto, Tutti)?
B4X:
Wait For CheckImpiantoPeriferico (oImpianto, Tutti)

mi dà errore
pagReport - 171: La dichiarazione attuale non corrisponde alla precedente.
Previous: {Type=String,Rank=0, RemoteObject=True}
Current: {Type=Impianto,Rank=0, RemoteObject=True}

se la scrivo cosi
B4X:
 Wait For (CheckImpiantoPeriferico (oImpianto , Tutti))
'e
B4X:
Sub CheckImpiantoPeriferico(oImpianto As Impianto,Tutti As Int)As ResumableSub

errore
Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione della raccolta.

Nome parametro: index
Non tutti i punti chiave del codice restituiscono un valore. (warning #2)
 

Sagenut

Expert
Licensed User
Longtime User
Prova così
B4X:
Sub Test_Impianti_Periferici (Tutti As Int)
    
    GL.Log1("************** INIZIO TEST IMPIANTI PERIFERICI *********** " )
                
    For Each oImpianto As Impianto In  GL.lstImpianti
        Wait For (CheckImpiantoPeriferico (oImpianto, Tutti)) complete (Inutile as Object)
    Next

    GL.Log1("************** FINE TEST IMPIANTI PERIFERICI *********** " )
    
End Sub

Sub CheckImpiantoPeriferico(oImpianto As Impianto,Tutti As Int) as ResumableSub
    
    GL.Log1("Inizio CheckImpiantoPeriferico")
    Wait For (GL.oConn.Risponde(oImpianto.IP_PLC,"ping") ) complete (EsitoRispPLC As Boolean)
    GL.Log1("Fine CheckImpiantoPeriferico")
    Return Null   'Per restituire qualcosa per chiudere
        
End Sub
 

Sabotto

Active Member
Licensed User
Perfetto. Ci ero arrivato poco fa leggendo le ultime righe del primo post qui di Erel. Mi hai anticipato. Grazie, sei sempre molto disponibile tu e "quell'altro... ", quello giovincello... Luca.. qualcosa...😂
 
Top