Italian lamentela sulla nuova versione

LucaMs

Expert
Licensed User
Longtime User

LucaMs

Expert
Licensed User
Longtime User
Sleep(0) DA SOLO non può sostituire DoEvents; devi usarlo in accoppiata con Wait For (non è ciò che ha risposto Erel ma ha risposto con un link ad un post che me lo ha chiarito: https://www.b4x.com/android/forum/threads/b4x-resumable-subs-sleep-wait-for.78601/page-2#post-499130)
Ecco, il codice pubblicato nella pagina cui punta quel link contiene una stranezza non da poco: la CallSubDelayed chiama una routine (SecondSub_Complete) che... semplicemente non esiste! Ok, il codice funziona, ma è un "codice leggibile"? "Manutenibile"? Comprensibile? A me sembra assurdo.

B4X:
Sub FirstSub
   Log("FirstSub started")
   SecondSub
   Wait For SecondSub_Complete
   Log("FirstSub completed")
End Sub

Sub SecondSub
   Log("SecondSub started")
   Sleep(1000)
   Log("SecondSub completed")
   CallSubDelayed(Me, "SecondSub_Complete")
End Sub


Mi sembra che la cosa si stia incasinando sempre più!
 
D

Deleted member 103

Guest
esempio
sub ominochecammina
call(passodestro)
call(passosinistro)
call(passodestro)
call(passosinistro)
end sub

sub passodestro
call(alzoiltacco)
doevents
call(alzolapunta)
doevents
call(spostoilpiede)
doevents
call(poggioilpiede)
doevents
end sub

sub passosinistro
....
end sub

ecco, con i doevents vedi la realtà, con lo sleep(0) vedi un accozzaglia maledetta e siccome non tutte le sub sarebbero della stessa lunghezza temporale l'effetto finale non sara` un omino che a fatto un passo

Ma se usi la libreria "Threading" non è lo stesso o anzi meglio?
B4X:
Dim Thread1 As Thread

Sub passodestro
    alzoiltacco
    Thread1.Sleep(100)
    alzolapunta
    Thread1.Sleep(100)
    spostoilpiede
    Thread1.Sleep(100)
    poggioilpiede
    Thread1.Sleep(100)
End Sub

Sub alzoiltacco
   
End Sub
Sub alzolapunta
   
End Sub
Sub spostoilpiede
   
End Sub
Sub poggioilpiede
   
End Sub
 

moster67

Expert
Licensed User
Longtime User
Se ho capito bene (non ho ancora installato l'ultima versione di B4A) la keyword Wait For va seguita da un evento, esattamente come quando scrivi un Sub Nome_Evento. Probabilmente è un po' strano ma abbastanza geniale secondo me. Una volta che lo sai usare, non dovresti avere dei problemi.

I linguaggi di programmazione si evolvono e noi dobbiamo seguire se vogliamo rimanere aggiornati. Ora sto studiando Kotlin, che è un dialetto di Java, ma certe cose cambiano però mi diverto.....
 

Dey

Active Member
Licensed User
Longtime User
Ecco, il codice pubblicato nella pagina cui punta quel link contiene una stranezza non da poco: la CallSubDelayed chiama una routine (SecondSub_Complete) che... semplicemente non esiste! Ok, il codice funziona, ma è un "codice leggibile"? "Manutenibile"? Comprensibile? A me sembra assurdo.

B4X:
Sub FirstSub
   Log("FirstSub started")
   SecondSub
   Wait For SecondSub_Complete
   Log("FirstSub completed")
End Sub

Sub SecondSub
   Log("SecondSub started")
   Sleep(1000)
   Log("SecondSub completed")
   CallSubDelayed(Me, "SecondSub_Complete")
End Sub


Mi sembra che la cosa si stia incasinando sempre più!

Mi intrometto in questa discussione,
dipende dal lavoro che fate, sto lavorando ad un grosso progetto con uso intenso di JRDC2 e server, mi sono incasinato un sacco,
sto riscrivendo il tutto "PAZZO!" con le nuove funzioni, DoEvents lo avevo già abbandonato,
ragazzi tutt'altro sistema! molto più pulito e facile da seguire
penso che sia la versione con le funzioni più importanti che Erel ha fatto:),
spero che sistemi al più presto i pochi bachi che ci sono.
Saluti
 

LucaMs

Expert
Licensed User
Longtime User
I linguaggi di programmazione si evolvono e noi dobbiamo seguire se vogliamo rimanere aggiornati.
Potrebbero pure evolvere verso il GOTO LINE, ovvero peggiorare e questo mi sembra il caso. Certo, uno può anche non usare le routine riesumabili ed il problema è risolto; ma secondo me il punto principale è che il DoEvents di B4A non è come quello di .Net e quindi questo non ti consente di creare una pausa che non blocchi il processo e consenta l'aggiornamento della GUI.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
DoEvents lo avevo già abbandonato
Motivo?

Il DoEvents, in VB.Net, è indispensabile (o quasi) e funziona come ti aspetti!

Finora, tra l'altro, non ho avuto problemi nemmeno col DoEvents di B4A (ma la "nuova" app ne contiene già una dozzina e l'ho testata poco).


P.S. e poi c'è il piccolo problema che un conto è testare un sw per Windows, altro è farlo con le app Android: nel secondo caso, ti servirebbe un centinaio di dispositivi reali :mad:
 

Star-Dust

Expert
Licensed User
Longtime User
la CallSubDelayed chiama una routine (SecondSub_Complete) chiama una routine (SecondSub_Complete) che... semplicemente non !
Sono stati creati eventi apposta per poter essere gestiti dal Wait For, per questa ragione dicevo in qualche intervento prima (Post #4) che posso benissimo gestire gli eventi anche diversamente. Senza Wait For al verificarsi dell'evento eseguo un certo codice.
Concordo con @Filippo che é meglio il Threading
 
Last edited:

moster67

Expert
Licensed User
Longtime User
il punto principale è che il DoEvents di B4A non è come quello di .Net

Ricordati che in realtà il tuo codice in B4A-Basic va tradotto in Java. In Java non c'è DoEvents nello stesso senso come in VB o VB.Net. Forse Erel ha sbagliato aggiungere DoEvents quando ha scritto B4A-Basic? Col tempo ha realizzato però che DoEvents crea spesso problemi e ha trovato un altro metodo più o meno equivalente. Secondo me la libreria "threading" è una buona alternativa - in Java si usa spesso threading per aggiornare il GUI ma anche in questo caso vedo spesso Erel che chiede "Perché usi la libreria Threading?". Non so perché ma forse ha paura che non sia 100% compatible con il codice Java che viene generato da B4A? Non so.
 

Star-Dust

Expert
Licensed User
Longtime User
Erel suggerisce ad esempio:
B4X:
Dim sf As Object = Msgbox2Async("Delete?", "Title", "Yes", "Cancel", "No", Null, False)

Wait For (sf) Msgbox_Result (Result As Int)
If Result = DialogResponse.POSITIVE Then
   '...
End If

Io farei cosi
B4X:
Sub Button_Click
Dim Msb As MsgboxNotAsync
Msb.Initialize("Msb","Delete?", "Title", "Yes", "Cancel", "No", Null, False)
End SUb

Sub Msb_Click(Result as Int)
   If Result = DialogResponse.POSITIVE Then
   '...
   End I
End IF

Senza salti incondizionati, stesso risultato. Molte cose che fai con WaitFor e Sleep puoi ottenerle diversamente e forse con risultati migliori. Per cominciare Threandig di cui parliamo permette alla Sub di restituire risultati con return, Wait For non lo permette.
 

Star-Dust

Expert
Licensed User
Longtime User
Bah, io mollo la discussione, i due neuroni sono già stanchi da un pezzo; meglio consumarli per qualcosa di veramente utile ;)
Però questa conversazione é stato ugualmente proficua. Scrivendo scemenze ho raggiunto 500 messaggi e adesso sono un utente ben conosciuto :D:D:D
 

moster67

Expert
Licensed User
Longtime User
Però questa conversazione é stato ugualmente proficua. Scrivendo scemenze ho raggiunto 500 messaggi e adesso sono un utente ben conosciuto
Invece di scrivere tanti messaggi, concentrati a scrivere quelle belle classi (tipo il spinner con CustomView etc)!! :)
E' comodo wrappare dei views scritto in Java ma in realtà tanti view possono essere scritti direttamente in B4X come hai fatto tu. Ammiro questo! Bravo
 

Star-Dust

Expert
Licensed User
Longtime User
Invece di scrivere tanti messaggi, concentrati a scrivere quelle belle classi (tipo il spinner con CustomView etc)!! :)
E' comodo wrappare dei views scritto in Java ma in realtà tanti view possono essere scritti direttamente in B4X come hai fatto tu. Ammiro questo! Bravo
Grazie, le sto scrivendo ma per evitare di farle uscire una alla volta appena finite le pubblico tutte insieme con relativo codice.
... Cmq ho capito scrivo troppe scemenze ...:p:p:p:p
 
Top