Dato che qualcuno, in privato, mi ha indicato questo thread, qualcuno di cui non faccio il nome ma solo il nick, LordZenzo
, ho riletto ogni post (per un decimo di secondo ho avuto la tentazione di scrivere: "mi sono riletto il thread"; quante brutte abitudini linguistiche abbiamo preso, anche per questo motivo penso che i traduttori sw vocali e simultenei non saranno mai perfetti. Certo, oggi si potrebbe anche dire "mi sono riletto il thread", basterebbe farselo tatuare
).
Non ho notivà né scoperto trucchi utili, ma magari potrei precisare qualche risposta o commentare meglio.
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
Per il punto a), diciamo, non so quando sia necessario creare una pausa senza la necessità di aggiornare la GUI; l'unico caso che mi viene in mente potrebbe essere quando tu voglia visualizzare un msg all'utente per tot secondi senza che lui debba clickare qualcosa per chiuderlo (tipo un toast, che però prosegue con l'esecuzione del programma). Anche in questo caso potresti avere la necessità di "rinfrescare" la GUI.
Per il punto b) il DoEvents non fa sì che vengano gestiti eventi esterni al tuo programma, come accade invece con .Net.
Infatti preferisco la libreria Threading che aggiorna l'interfaccia grafica
Non so come funzioni quella libreria, mi pare di avegli dato un'occhiata una vita fà e di averla mollata per qualche motivo (forse devi creare un thread per ogni routine? Boh, qualcosa de genere, non ricordo). Sempre se non sbaglio, parlando del Wait For ti lamentavi di non poter far restituire un dato, ovvero chiamare una funzione, non un generico metodo; non mi pare che con i thread la cosa sia possibile e semplicissima.
Se non riesci a implementare il tuo codice attuale senza usare DoEvents, farlo presente nel forum in inglese e molto probabilmente Erel ti dirà cosa fare. Così cogli l'occasione di presentare le tue lamentele direttamente a Erel perché non credo che Erel legge questo thread visto che in italiano.
In questo caso Erel ha suggerito qualcosa che non riesce a sostituire il DoEvents inserito in un loop per aggiornare la GUI e non potrebbe, dato che quelle due istruzioni, Sleep e Wait For, restituiscono il controllo ad eventuali routine chiamanti, queste potrebbero essere concatenate, nel tuo progetto, e dare vita ad un bel casino.
Inoltre, bisogna fare attenzione a "presentare le tue lamentele direttamente ad Erel", a confutare, discutere novità di b4a perché Erel è alquanto suscettibile ed
IN PRIVATO minaccia di
ignorarti o bannarti! (chissà perché scrivo questo; beh, provate ad immaginare come mai io non abbia ricevuto la sua approvazione, tramite commento o Like, a
questo mio recente post, nel quale ho pubblicato una routine da aggiungere ad una classe di Erel su richiesta di un membo; né risposte ad altri miei successivi post, anche domande).
Se io fosse in te, scriverò il tuo codice attuale (ovviamente il snippet o i sub) e poi chiedi a Erel come modificarlo....
L'avevo fatto, avevo scritto un paio di routine che speravo fossero in grado di gestire quella situazione (loop con DoEvents all'interno per aggiornare la GUI). Quel mio codice, però, che usava le nuove funzionalità, aveva qualche problemino: eseguiva delle istruzioni (log) in ordine errato, forse nemmeno aggiornava la GUI ed oltretutto
lo Sleep impostato a 1000 ms... non faceva pause! Erel ha corretto quel codice? Ha spiegato come mai non funzionasse e addirittura non avvenisse alcuna pausa?
No.
In quel codice la FirstSub contiene un Wait For: e se quella FirstSub venisse chiamata da un'altra routine? Risalite a catena involontarie.
Erel suggerisce ad esempio:
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
Stesso discorso: dove si trova quel codice, con Dim, Wait For e If Result? In una routine chiamata da un'altra, alla quale verrebbe ceduto immediamente il controllo.
Va beh, potrei continuare all'infinito. Ultima cosa, fuori tema perfino con questo mio stesso post: in questo thread ho notato battute varie da vari membri i quali, proprio per questo, dovrebbero sentirsi in dovere di mettere un Like a questa mia RISPOSTA:
https://www.b4x.com/android/forum/threads/errore-a-me-inspiegabile.80954/#post-513011
Non che i Like mi servano o siano utili, ovviamente, ma per sottolineare che questo commento:
ed è la seconda volta che rilasci i tuoi consigli (inframmezzati da battute da ragazzino di terza media; evitale e assumi un atteggiamento consono alla tua età ed al fatto che scrivi in un forum tecnico)
fosse fuori luogo, stupido ed inefficacemente offensivo.
P.S. Beh, un Like adesso sarebbe tardivo ed inutile, probabilmente, visto che il post non verrebbe riletto. Diciamo che me lo sarei aspettato da alcuni di voi (grazie
@Filippo)