Italian Dopo Wait For (ResumableSub) il codice non prosegue con l'istruzione successiva

Star-Dust

Expert
Licensed User
Longtime User
Se poi la preoccupazione sarebbe il fatto che si ritorni su RESUME.
Si può modificare così
B4X:
Sub Activity_Create(FirstTime As Boolean)
    ' Activity.LoadLayout("layMainTurno")
    If FirstTime Then 'Solo la prima volta
        OperazioniIniziali
    Else
        If  File.Exists(DirDestination,NomeFileTurno) And File.Size(DirDestination,NomeFileTurno)>0 Then
            GetTurnoGiornoAndShow
        End If
    End If
End Sub

Sub OperazioniIniziali
    Wait for (DownloadFileTurno1) complete (Result As Boolean)
    If Result Then
        Giorno=DateTime.GetDayOfMonth(DataOggi)
        GetTurnoGiornoAndShow
    Else
        Log("File non scaricato")
    End If
End Sub

Sub DownloadFileTurno1 As ResumableSub
    NomeFileTurno = NomeMese & (Anno Mod 2000) & ".TEL"
    dbxFiles.download(File.Combine(DirTurni_DropBox,NomeFileTurno), DirDestination, NomeFileTurno)

    Wait For dbxFiles_DownloadFinished(success As Boolean, meta As FileMetadata, error As String)
    ' Non so se è corretto questo evento

    Return success
End Sub

Sub GetTurnoGiornoAndShow
    RicavaTurnoDelGiorno
    MostraTurni
End Sub

Sub RicavaTurnoDelGiorno
    For i = 0 To 5
        TurnoDelGiorno(i)=RigaTurno(i).SubString2(Giorno-1,Giorno)
    Next
End Sub
 

Sabotto

Active Member
Licensed User
Come l'ha scritta lui non è resumable sub. Usa DoWhile anzichè una WaitFor
Scusami, per capire: come l'ho scritta io è come è scritta nel post dove spiega le Resumable Sub, qui
B4X:
Sub Button1_Click
   Wait For(Sum(1, 2)) Complete (Result As Int)
   Log("result: " & Result)
   Log("after sum")
End Sub

Sub Sum(a As Int, b As Int) As ResumableSub
   Sleep(100)
   Log(a + b)
   Return a + b
End Sub

Come andrebbe scritta altrimenti?
Al posto della Sum ho messo la mia DownloadFileTurno1
Dove sta scritto che deve esserci "Wait for" al'interno della Resumable Sub? Il "Wait For" con "Complete", deve stare nella chiamata alla Resumable Sub che deve restituire il valore per far proseguiore il codice. Io perlomeno cosi ho capito ma, per carità, sto "giocando" con B4A solo da 10 giorni...
Mi sto perdendo sinceramente...
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Scusami, per capire: come l'ho scritta io è come è scritta nel post dove spiega le Resumable Sub, qui

Questo è quello che hai scritto tu:
B4X:
Sub DownloadFileTurno1() As ResumableSub
    NomeFileTurno = NomeMese & (Anno Mod 2000) & ".TEL"
    dbxFiles.download(File.Combine(DirTurni_DropBox,NomeFileTurno), DirDestination, NomeFileTurno)
    Do While File.Size(DirDestination,NomeFileTurno)=0
            Log("file non ancora scaricato del tutto")
     Loop
     Return True
End Sub
Noti qualche somiglianza col codice di @Erel?
In quella di @Erel c'è lo Sleep anzichè WaitFor ma comunque la rende una ResumableSub. Inoltre il codice deve ottenere una cosa diversa. Infine non c'è il DoWhile per l'attesa.

Come Andrebbe? Ma io già ti ho scritto 2 codici. Prendi uno di quelli che ti sono stati suggeriti (i miei e anche quelli suggeriti da altri) e provali.
 

Sabotto

Active Member
Licensed User
Il problema è che la DownloadFileTurno1 NON è una ResumableSub, è quello che sto tentando di dire da un po'.
Le ResumableSub hanno una iconcina sulla destra della dichiarazione (un piccolo cerchietto con una freccina), non basta mettere "As ResumableSub" nella dichiarazione.

Per cui la linea
Wait for (DownloadFileTurno1) Complete (Result As Boolean)
non funziona correttamente poichè non essendo una ResumableSub reale, l'evento "Complete" non funziona correttamente.
Bene. E come dovrei fare per rendere DownloadFileTurno1 ResumableSub?
L'iconcina appare se in una quasiasi sub usi Sleep o Wait For (e forse anche Doevents) mi pare
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Scusami, per capire: come l'ho scritta io è come è scritta nel post dove spiega le Resumable Sub

No, non è così, leggi i miei post precedenti dove ti spiego il perchè.

Eccoti una ResumableSub:

Immagine0.png


Una ResumableSub ha quella iconcina (che ti ho segnato con la freccia rossa)
La tua sub ha questa iconcina ????
 
Last edited:

Sabotto

Active Member
Licensed User
No, non è così, leggi i miei post precedenti dove ti spiego il perchè.

Eccoti una ResumableSub:
View attachment 98437

Una ResumableSub ha quella iconcina (che ti ho segnato con la freccia rossa)
La tua sub ha questa iconcina ????
Ti avevo in pratica risposto poco fa. Tra poco appare... (a proposito ma perchè ogni msg deve essere "autorizzato"? e spesso passa anche parecchio tempo..ma è sola curiosità, bellissimo forum, per carità, che mi sta aiutando moltissimo!)
 

Sabotto

Active Member
Licensed User
In quella di @Erel c'è lo Sleep anzichè WaitFor ma comunque la rende una ResumableSub. Inoltre il codice deve ottenere una cosa diversa. Infine non c'è il DoWhile per l'attesa.
Ma neanche nella mia c'è WaitFor! (parliamo della Sub dichiarata come Resumable Sub, giusto?
La "Wait For" l'ho usata per chiamare la Resumablesub cosi come Erel l'ha usata nel Button_Click per chiamare la sua Resumable sub (Sum)!
E comunque se aggiungessi uno sleep(500) che per me non inficierebbe proprio nulla, l'iconcina a fianco uscirebbe.
Mi sto perdendo 🥴
Cmq devo fare altre prove, tra cui quelle suggerite, ma come avrete capito lo scopo è quello di eseguire determinate istruzioni solo dopo essere certo che il file è stato scaricato ed è "pieno", perchè all'inizio per un tempo breve, il file esiste ma è di .size = 0.
Ho già una versione funzionante usando appunto il do while... ma volevo elegantizzare avendo scoperto da poco le resumable sub e mi sembrava un modo piu elegante.
Probabilmente devo approfondire. Questo post ad esempio non l'avevo letto.
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Ma neanche nella mia c'è WaitFor! (parliamo della Sub dichiarata come Resumable Sub, giusto?
La "Wait For" l'ho usata per chiamare la Resumablesub cosi come Erel l'ha usata nel Button_Click per chiamare la sua Resumable sub (Sum)!
E comunque se aggiungessi uno sleep(500) che per me non inficierebbe proprio nulla, l'iconcina a fianco uscirebbe.
Mi sto perdendo 🥴
Cmq devo fare altre prove, tra cui quelle suggerite, ma come avrete capito lo scopo è quello di eseguire determinate istruzioni solo dopo essere certo che il file è stato scaricato ed è "pieno", perchè all'inizio per un tempo breve, il file esiste ma è di .size = 0.
Ho già una versione funzionante usando appunto il do while... ma volevo elegantizzare avendo scoperto da poco le resumable sub e mi sembrava un modo piu elegante.
Probabilmente devo approfondire. Questo post ad esempio non l'avevo letto.
Stai fraibtendendo quello che ho scritto.
Credo che non hai capito il funzionamento della ResumableSub, il che ti porta a fraintendere.

Qualcuno già in questo thread ha spiegato cosa sono. Rileggiti con attenzione quello che è stato scritto sicuramente avrai in quadro completo.

io mi arrendo.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Mi sto perdendo 🥴

Veramente ci siamo persi tutti 😁

Stai facendo troppa confusione e valutando troppi elementi contemporaneamente.
Ripartiamo da zero, ossia con la routine principale che deve scaricare il file.
Eccoti la mia versione (leggermente modificata rispetto alla tua):
B4X:
Sub DownloadFileTurno1()
    NomeFileTurno = NomeMese & (Anno Mod 2000) & ".TEL"
    dbxFiles.download(File.Combine(DirTurni_DropBox,NomeFileTurno), DirDestination, NomeFileTurno)
    Do While File.Size(DirDestination,NomeFileTurno)=0
           DoEvents
     Loop
End Sub

Inizia con il provare questa routine per capire se funziona bene o se qualche volta ha dei problemi.
(devi provarla tante tante volte con file diversi e di diverse dimensioni)
Quello che bisogna anche capire ora è per quanto tempo il programma si fermerà dentro al ciclo DoWhile....Loop perchè se si tratta di pochi secondi la cosa è accettabile, altrimenti bisognerà modificare quel ciclo DoWhile....Loop in altro modo, ma direi che per un principiante per ora può andar bene scritto così.

per testarla potresti usare:
B4X:
NomeMese = .....
Anno = .....
Dim tempo As Long = DateTime.Now
DownloadFileTurno1
tempo = DateTime.Now - tempo
MsgBox(tempo & " ms"; "")

Facci sapere i risultati, poi passiamo allo step successivo
 

Sabotto

Active Member
Licensed User
va bene. faro delle prove e approfondisco. È evidente che forse avevo capito male. Ora sono fuori casa. Vi terro aggiornati grazie a tutti
 

Sagenut

Expert
Licensed User
Longtime User
va bene. faro delle prove e approfondisco. È evidente che forse avevo capito male. Ora sono fuori casa. Vi terro aggiornati grazie a tutti
Le ResumableSub all'inizio sono state accolte male un pó da tutti perché un concetto particolare esclusivo di B4X.
Ma poi alla fine abbiamo imparato ad apprezzarle una volta chiarito il concetto. :)
 
Top