WAIT
Il comando WAIT serve ad indicare a Gambas di fermare l'esecuzione dell'applicazione in attesa di un evento.
La sintassi è:
<<codice 1>> WAIT [n] <<codice 2>>
Se n è specificato, WAIT attende n secondi prima di proseguire con l'esecuzione delle istruzioni contenute in <<codice 2>>.
In genere WAIT è utilizzato per attendere l'esecuzione di un evento. Inserito in qualunque parte del programma, ferma l'esecuzione dello stesso ed aggiorna l'interfaccia grafica (l'aggiornamento dell'interfaccia è inserita in un ciclo di operazioni che l'interprete esegue ad intervalli regolari).
La parola chiave WAIT può essere seguita da un valore numerico decimale (es.: 0.1 oppure 1 oppure anche 10 e così via) che indica i secondi di attesa che vogliamo impostare. Nel caso n assuma valore 1 il programma attenderà 1 secondo prima di eseguire le istruzioni successive. Analogamente se n vale 0.1 o 10 saranno attesi 0.1 o 10 secondi. La specificazione di un valore di attesa modifica anche l'esecuzione del comando: infatti, oltre ad aggiornare l'interfaccia grafica e ad attendere per un determinato lasso di tempo, Gambas gestisce anche gli eventi della tastiera e del mouse, permettendo quindi all'utente di interagire con il programma.
Esempio 1 - Attesa prima della visione di un messaggio (riga di comando)
PUBLIC SUB Main() WAIT 1 PRINT "Gambas è il migliore!" END
Spiegazione
L'esempio molto semplice è eseguito sul codice di un programma da riga di comando. Si noti come WAIT fa in modo che quando il programma viene lanciato attende un secondo prima di mostrare il messaggio "Gambas è il migliore!".
Paragone fra Wait e Sleep
Paragonando le istruzioni Wait e Sleep, il runtime con Wait prosegue, mentre con Sleep si arresta.
Wait permette l'avvio di altri eventi, Sleep lo impedisce.
Si provi il seguente codice prima con Wait.
Attivando il menu col tasto destro del mouse il ciclo si blocca, permettendo così la sollevazione dell'Evento del Menu. Il ciclo poi riprendere quando il tasto viene rilasciato.
Public Sub Button1_Click() Dim i As Integer For i = 1 To 50 Print i <FONT Color=redWait</font> 1 ' poi "Sleep" Next End Public Sub Menu1_Click() Print "Prova" End
Utilizzando invece l'istruzione Sleep l'Evento del Menu viene impedito.
Attesa del completamento di un comando
La parola-chave Wait - priva di valore numerico di attesa - può essere utilizzata anche per attendere che un'operazione, che un comando - lanciato con Shell o Exec - deve svolgere, sia completata, prima di passare alla riga successiva del codice.
Mostriamo un esempio, nel quale si cambieranno i permessi del file-device protetto "/dev/console " prima che questo possa essere aperto in scrittura:
Public Sub Main() Dim dev As String Dim fl As File dev = "/dev/console" Shell "echo 'mia_password' | sudo -S chmod 666 " & dev Wait ' Resta in attesa, finché il cambio dei permessi del file-device non è completato Print "\n\nFile-device '"; dev; "' accessibile: "; Access(dev) End
Gambas è a singolo thread e utilizza un ciclo di eventi per gestire le molteplici fonti di eventi in un programma.
Quando si usa "Shell ... Wait ", si chiede a Gambas di sospendere quel ciclo di eventi e di attendere che il comando finisca. Durante questo periodo, nessun evento del mouse o della tastiera viene elaborato e il desktop ritiene che il programma non risponda. Apparentemente non si vuole che altro codice nel proprio programma venga eseguito, mentre lo script non è finito; pertanto il ciclo di eventi, ossia la fonte principale del codice che viene eseguito in modo asincrono, deve essere disabilitato, che è appunto ciò che si chiede di fare con il comando "Wait".
E' importante comprendere, dunque, che esistono soltanto due possibilità: bloccare con il comando "Wait" tutti gli eventi (in questo caso, lo script viene eseguito in modo sicuro fino al completamento prima che Gambas continui con il restante codice) o continuare a elaborare gli eventi, ma questo richiede che non venga usato "Wait".