Italian lamentela sulla nuova versione

LordZenzo

Well-Known Member
Licensed User
Longtime User
ecco
nella mia app, avevo una sub chiamata Sleep, perche in tutti i linguaggi esiste un modo per fermare per un tot di tempo il flusso
ora finalmente viene creata anche qui, ma ....
non e` uno Sleep, manco per niente, Sleep(1000) dovrebbe fermare per 1 secondo il flusso ed invece fa esattamente quello che deve fare il DoEvents, ossia fermare la sola sub o ciclo, per passare momentaneamente al flusso principale, in caso di cicli lunghi
Sleep deve fermare tutto, esattamente come in tutti i linguaggi seri
 

Star-Dust

Expert
Licensed User
Longtime User
La funziona serve proprio quello, a restituire momentaneamente il flusso alla routine chiamante. Può essere uso in certi casi ma non per quello che serve a te. Io neanche ce l'ho la nuova versione perché non mi spetta ma non la userei preferisco altri metodi.

Sei hai seguito la conversazione fra me e Erel sulla funzione sleep e wait for avrai visto che ho trovato una libreria che messo in sospensione le sub che forse può fare a caso tuo, ed é quella che io userei per sostituire DoEvent o per sospendere una Sub e far continuare il flusso delle altre.
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Per fermare il flusso senza usare il DoEvents c'é questo metodo usato da Erel
B4X:
Dim jo AsJavaObjectDim l As Long = 500
jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l))
Io avrei creato una nuova KeyWord... magari si può chiedere a Erel per una prossima versione... Stay (Delay as int) :):):) la metto fra le Wish?

La libreria che dicevo prima é la seguente:
https://www.b4x.com/android/help/threading.html#lock_waitfor
Example: https://www.b4x.com/android/forum/threads/threading-library.6775/#content

Non é poi cosi nuova, circa di 5 anni fa, Alcuni metodi sono

Method_636.png
Sleep (mSecs As Int)
Method_636.png
WaitFor (timeout As Int) As Boolean


Ma a differenza della Versione 7, usano Thread in Background e quindi lavorano e si fermano mentre il flusso principale continua per conto suo. Mentre il Wait For e Sleep della versione 7, il flusso ritorna alla routine chiamante.

Io per ricomprarla aspetto qualche versione ancora, l'ho comprata a novembre con aggiornamento a 2 mesi, non la ricompro se non ci sono aggiornamenti significativi.
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
io ho creato una mia sleep, che mette in pausa il flusso per n secondi
e poi, esiste il DoEvents, non vedo perche creare un comando che fa la stessa identica cosa
Dicono che é obsoleta e che crea problemi al flusso. Ho letto un post, che credo fosse di Erel, che spiegava alcuni problemi, adesso non capendo bene l'inglese e avendo capito poco non posso dare molte spiegazioni in merito.

Ma visto che esiste uno Sleep che ferma il flusso perché non avere una KeyWord. Il doEvents nasce per dare il tempo al dispositivo a completare le operazioni in sospeso, magari della GUI. Noi poi spesso lo usiamo per crearci uno Sleep.
 
Last edited:

LordZenzo

Well-Known Member
Licensed User
Longtime User
il DoEvents, almeno per il pc, serve a dare modo al sistema operativo di elaborare la lista eventi che sono in sospeso
proprio come dice il nome
se devo creare una pausa nel flusso del programma, non uso il DoEvents ma un loop temporizzato
se devo fermare un ciclo lungo per elaborare gli eventi esterni al mio programma uso il DoEvents
se devo fermare un ciclo lungo per elaborare gli eventi interni o ho fatto male il programma o uso altri sistemi
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
erel dice di cambiare doevents con sleep(0)
ma non e` la stessa cosa, sleep blocca la sub in cui e` inserita e torna il controllo alla sub che ha richiamato la sub con lo sleep
il DoVents invece torna il controllo al sistema operativo permettendo ad esempio alla scheda video di ricreare la finestra
 

Star-Dust

Expert
Licensed User
Longtime User
Certo che non é la stessa cosa.
Io rispondevo al fatto che lo Sleep non ferma il flusso ma che però esiste in Java il metodo Sleep nativo nei Thread come tutti i linguaggi seri e puoi richiamarlo.

Poi noi (per noi intendo io e qualche altro) usiamo un Loop che controlla il tempo trascorso con doEvetns nel mezzo per crearci una pausa, che non é la stessa cosa di Thread.Sleep, ne dello Sleep di B4A 7 e nemmeno lo Sleep usato nella Libreria Threading.
Però quando serve una pausa io ho usato DoEvents e da poco uso il Threads.Sleep

Sembrano uguali ma hanno sfumature diverse. Poi per le App che creo io cambierebbe poco, ma per quelle più serie sicuramente fa differenza cosa usi.
 

Star-Dust

Expert
Licensed User
Longtime User
Personalmente preferisco continuare a usare la Libreria Threading e non le nuove KeyWord, per alcuni motivi.

1) Le sub sospese con le nuove KeyWord non possono restituire dati. E spesso io le userei per creare MsgBox , InputBox, eccc. che invece vorrei con la restituzione dell'esito
2) Se devessi usare Wait For Msgbox_Result (Result As Int), quindi aspettare che genera l'evento, a questo punto metterei il codice dentro l'evento senza usare le nuove KeyWord.
B4X:
Sub Msgbox_Result (Result As Int),
'Mio codice
End SUb
3) Per usare le funzioni asincrone mi sono convinto che é meglio usare threads che lavorano in BackGround
4) Non ho B4A 7.0

Ma queste sono solo mie convinzioni, probabilmente chi é più esperto di me la pensa diversamente.
 

MarcoRome

Expert
Licensed User
Longtime User
Se inserisci sleep(0) in un ciclo ( provalo su 10000 ) e dentro il cilco inserisci una label con il contatore, con sleep(0) vedrai i dati nella label. Differentemente non vedrai nulla fino a quando il ciclo non sarà concluso.
Lo 0 rappresenta come ha detto luca almeno 0 micro secondi. La precisione di sleep dipende da cosa offre il sottostante S.O. Ad esempio se chiedi la spsensione per 30 millisecondi il thread sarà sospeso per "almeno" 30 millisecondi
 

LucaMs

Expert
Licensed User
Longtime User
Se inserisci sleep(0) in un ciclo ( provalo su 10000 ) e dentro il cilco inserisci una label con il contatore, con sleep(0) vedrai i dati nella label. Differentemente non vedrai nulla fino a quando il ciclo non sarà concluso.
Lo 0 rappresenta come ha detto luca almeno 0 micro secondi. La precisione di sleep dipende da cosa offre il sottostante S.O. Ad esempio se chiedi la spsensione per 30 millisecondi il thread sarà sospeso per "almeno" 30 millisecondi
E' più o meno il test che avevo fatto.

Test che non solo mi è servito per vedere come aggiornasse la GUI ma anche per vedere se possa effettivamente essere utilizzato come il "normale" DoEvents *.

Il risultato non è stato quello sperato:
B4X:
Sub Activity_Resume
    For i = 1 To 10
        LogColor("i : " & i, Colors.Blue)
        Mostra
    Next
End Sub

Sub Mostra
    For j = 1 To 100
        Label1.Text = j
        LogColor("J : " & j, Colors.Blue)
        Sleep(0)
    Next
End Sub

* Il punto, SECONDO ME, è che il DoEvents non esiste in Android, penso che sia stato un tentativo di Erel di imitare quello esistente in VB.Net; ma tra quello di B4A e quello di VB.Net, visto che Erel dice di non usarlo per non bloccare il main thread, la differenza penso che sia che mentre in VB.Net effettivamente il controllo viene ceduto al processo ed alla CPU, in B4A viene ceduto solo alla gestione grafica dell'Activity "in corso".
 

Star-Dust

Expert
Licensed User
Longtime User
E' più o meno il test che avevo fatto.

Test che non solo mi è servito per vedere come aggiornasse la GUI ma anche per vedere se possa effettivamente essere utilizzato come il "normale" DoEvents *.

Il risultato non è stato quello sperato:
B4X:
Sub Activity_Resume
    For i = 1 To 10
        LogColor("i : " & i, Colors.Blue)
        Mostra
    Next
End Sub

Sub Mostra
    For j = 1 To 100
        Label1.Text = j
        LogColor("J : " & j, Colors.Blue)
        Sleep(0)
    Next
End Sub

* Il punto, SECONDO ME, è che il DoEvents non esiste in Android, penso che sia stato un tentativo di Erel di imitare quello esistente in VB.Net; ma tra quello di B4A e quello di VB.Net, visto che Erel dice di non usarlo per non bloccare il main thread, la differenza penso che sia che mentre in VB.Net effettivamente il controllo viene ceduto al processo ed alla CPU, in B4A viene ceduto solo alla gestione grafica dell'Activity "in corso".
se non ho capito male anche WaitFor e Sleep sono create e dipendono dal compilatore B4A e non da Android/Java
 

Star-Dust

Expert
Licensed User
Longtime User
Non ho provato ma penso che con VB.Net il risultato sarebbe stato:
i: 1

j: 1
j:2
j:..
J:100

i:2

j: 1
j:2
j:..
J:100

etc.

mentre con queste resumable il controllo torna alla routine chiamante e l'esito è completamente diverso.
Qual'è l'esito dei log con Sleep
 
Top