Sandro Bizioli


Chi sogna di giorno conosce molte cose che sfuggono a chi sogna soltanto di notte. (E.A.Poe)
Mappa

Attenzione ai loop mal gestiti.

Istrizione utilizzata per ripetere un blocco di codice fino a quando una condizione booleana resta o non diventa True.

Fino a qui nulla di strano. Il problema può nascere da un suo improprio utilzzo.
Che cosa accade alla nostra applicazione se la condizione di uscita dal loop non si presentasse mai?
Mi spiego meglio: ho visto che molto spesso si tende ad utilizzare questo loop come cuore dell'applicazione, vale a dire che al suo interno vi sono una serie di operazioni che continuano ad essere ripetute fino a quando, ad esempio, non viene valorizzata la nostra condizione d'uscita.

Supponiamo di dover leggere dei dati dalla porta Com1 per poi analizzarli e memorizzarli in un database.
Il nostro programma avvierà l'operazione alla pressione di un CommandButton "Start" e terminerà alla pressione di un CommandButton "Stop" che valorizzerà la variabile booleana "Esci" di uscita.

Dim Esci As Boolean

Private Sub Start_Click()
  Do
    DoEvents()
    ' Leggo la porta com
    ' Analizzo il valore
    ' Lo scrivo nel database
  Loop While Not Esci = True
End Sub

Private Sub Stop_Click()
  Esci =
True
  Unload(Me)
End Sub

Visto così non è sbagliato, ma vi è un grave errore di fondo: cosa accade se l'operatore chiude la form o se un'istruzione all'interno della mia applicazione chiama l'unload della form senza preoccuparsi di interrompere il ciclo?
Semplice: l'applicazione non verrà terminata e, nonostante non appaia più nulla a video, essa continuerà ad operare ed essere presente nei processi del sistema.
Beh, basta stare un po' attenti è vero ed assicurarsi che in fase di Unload la variabile Esci venga valorizzata a True ecc. ecc.
Non sarebbe forse meglio modificare la logica di funzionamento?
Diciamo che un ciclo è atto ad eseguire una serie di operazioni ben definite e non dovrebbe dipendere da situazioni esterne, come la pressione di un ulteriore tasto o la chiusura dell'applicazione stessa.
Nel caso in cui avessimo bisogno di un controllo "temporale" e costante sarebbe il caso di utilizzare oggetti come il Timer, con un interval molto basso se necessario, ed inserirvi lì le nostre istruzioni.
In tal modo all'uscita dal programma questo interromperà automaticamente le sue operazioni lasciando "libero" l'applicativo.

Categoria: VB6
giovedì, 15 mar 2007 Ore. 13.39
Statistiche
  • Views Home Page: 111.313
  • Views Posts: 567.203
  • Views Gallerie: 115.945
  • n° Posts: 227
  • n° Commenti: 222
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003