Italian Resumabile Sub

toro1950

Active Member
Licensed User
Buona serata a tutti, nella mia app, quasi alla fine, ho introdotto diversi sub, alcuni di questi portano alla fine del nome un cerchio con una freccia
verso sinistra, passando il mouse esce il fumetto Resumabile Sub, sul nome del sub esce il nome sub come Void invece senza il segno
Riassumibile Sotto esce il nome sotto come stringa. Cosa significa tutto questo?.
in uno di questi sub c'è un controllo che non ferma l'esecuzione dell'app come dovrebbe
B4X:
if condizione... then
        Msgbox2Async("", "Sicuro di voler......???", "Sì", "", "No", Null, False)
        Attendi Msgbox_Result (risultato come Int)
        Se Risultato = DialogResponse.NEGATIVE Allora
        nr=Vero
        Finisci se
    Fine se
 

toro1950

Active Member
Licensed User
Scusatemi per il codice,non riesco a togliere la traduzione automatica in italianio del browser
 

Sagenut

Expert
Licensed User
Longtime User
Una Sub che al suo interno contiene uno Sleep o un Wait For diventa automaticamente una Resumable Sub.
La particolarità di queste Sub è ad esempio che possono essere anche richiamate più volte contemporaneamente e ogni chiamata riceverà il suo risultato separatamente.
C'è un esempio dove una Resumable Sub viene usata per caricare delle immagini dal web.
La Sub viene chiamata 5 volte subito, e ad ogni chiamata viene indicata una diversa ImageView che dovrà ricevere il risultato.
Ogni ImageView riceverà la sua immagine.
E le 5 richieste lavorano tutte in comtemporanea in maniera asincrona, perchè ad esempio potrebbe apparire prima l'immagine dell'ultima richiesta (nel caso fosse stata molto piccola da scaricare).
Una cosa importante da ricordare di queste Sub è che per restituire un risultato con il Return bisogna usare il finale as ResumableSub.
Una sub normale sarebbe così
B4X:
Private Sub Somma (x as Int, y as int) as Int    'Definiamo un Int come ritorno perchè sarà un numero
    Return x+y
End Sub
Se fosse una Resumable Sub invece dovrebbe essere così
B4X:
Private Sub Somma (x as Int, y as int) as ResumableSub    'Qualunque sia il dato di ritorno
    Sleep(100)
    Return x+y
End Sub
Una cosa a cui bisogna prestare attenzione è che quando utilizzi uno Sleep o un Wait For, il flusso del programma tornerà al punto dove è partita la chiamata e il programma proseguirà, se non è stato strutturato bene per effettuare l'attesa.
Quindi avremmo bisogno di vedere il tuo codice dove effettui la chiamata dove non c'è l'attesa che vorresti per capire dove è l'inghippo.
 

Sagenut

Expert
Licensed User
Longtime User
Chiaramente se non puoi o non vuoi postare il tuo codice originale magari perchè contiene dati sensibili, cerca almeno di ricreare lo stesso problema in un programmino nuovo con 2 o 3 sub spiegando come vorresti che interagissero.
 

toro1950

Active Member
Licensed User
Buongiorno, grazie dei consigli e delle spiegazioni che mi hanno aiutato a risolvere il problema in questo modo; visto che la chiamata della
sub avveniva da un altra Resumabile Sub, ho spostato a questa il codice Msgbox2Async ecc., qui ha funzionato perfettamente in base alla risposta, alla vecchia sub ho lasciato solo il controllo della condizione, inoltre come mi avevi spiegato ha perso la proprietà di Resumabile Sub
 

Sagenut

Expert
Licensed User
Longtime User
Puoi tranquillamente chiamare quante sub vuoi in cascata, ma dovrai farlo sempre tramite dei Wait For in modo che ogni chiamata attenda l'effettivo completamento.
Se comunque hai risolto, meglio così.
 

Sagenut

Expert
Licensed User
Longtime User
C'è anche un modo lievemente diverso di utilizzare il Wait For.
Più tardi ti posto un esempio.
 

LucaMs

Expert
Licensed User
Longtime User
La particolarità di queste Sub è ad esempio che possono essere anche richiamate più volte contemporaneamente e ogni chiamata riceverà il suo risultato separatamente.
C'è un esempio dove una Resumable Sub viene usata per caricare delle immagini dal web.
La Sub viene chiamata 5 volte subito, e ad ogni chiamata viene indicata una diversa ImageView che dovrà ricevere il risultato.
No, non è questa la particolarità delle Resumable. Infatti, potresti benissimo chiamare 5 volte di seguito una stessa "normale" funzione ottenendo i 5 risultati "separatamente".

Semplice, ovvio e per niente intelligente esempio di chiamata alla tua Somma NON-resumable:
B4X:
Dim Somma1, Somma2, Somma3 As Long

Somma1 = Somma(1, 2)
Somma2 = Somma(10, 20)
Somma3 = Somma(100, 200)
Quale sarebbe il problema? Nessuno.

La caratteristica delle resumable è che consentano al flusso dell'elaborazione di proseguire "altrove", per poi rientrare nella resumable e proseguire con l'esecuzione delle righe scritte dopo uno Sleep o Wait For scritto al suo interno:
B4X:
Sub UnaResumable As Resumable
' qui alcune righe che vengono subito eseguite
'
' Per 2 secondi verrano eseguite righe scritte altrove, nel progetto.
' Potrebbe essere anche un'istruzione Wait For, anziché una Sleep, e spesso lo sarà, si attenderà il risultato di altre funzionalità/eventi.
  Sleep(2000)

' Il flusso di elaborazione proseguirà qui, RIENTRERA' qui, dopo i 2 sec (o dopo un Wait For)
' qui alcune righe che verranno eseguite al rientro in questa Sub, alla sua "riesumazione"

End Sub
 
Last edited:
Top