Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Interrompere un ciclo While attraverso la pressione del tasto ESC

    Ciao a tutti.

    Vorrei chiedervi se sapete come si fa ad interrompere un ciclo While premendo il tasto ESC.
    Ho provato a mettere la proprietà KeyPreview = TRUE al form in cui è presente il ciclo ma non va. Ho usato poi KeyPress, ma non va...... insomma non ne cavo piedi.

    Il codice è questo:

    While myReader.Read()
    articoloRilevato = myReader.GetInt32(0)
    'etc... se premo ESC deve uscire, ma come si fa?
    End While

    Grazie mille in anticipo per un valido aiuto
    e mille auguri per uno splendido 2011!!!

  2. #2
    Possibilità 1:
    inserisci una variabile Boolean a livello di classe, e nel KeyPress se viene premuto Esc la imposti a True; dentro al ciclo inserisci una DoEvents e controlli ad ogni iterazione se la variabile in questione è a True, in tal caso esci dal ciclo. Ovviamente prima di cominciare il ciclo la variabile in questione va resettata.

    Possibilità 2: stessa cosa, ma niente DoEvents e il ciclo lo esegui in un thread separato (avendo cura di proteggere con un lock la variabile Boolean in questione per garantire che il tutto rimanga thread-safe). Dato che il ciclo viene eseguito in un thread separato, da esso non si potrà accedere direttamente alla GUI (si può solo tramite il trucco di Control.Invoke).

    Consiglio: se non sai programmare in multithreading, usa la possibilità 1 e ti risparmierai molti mal di testa.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da MItaly
    Possibilità 1:
    inserisci una variabile Boolean a livello di classe, e nel KeyPress se viene premuto Esc la imposti a True; dentro al ciclo inserisci una DoEvents e controlli ad ogni iterazione se la variabile in questione è a True, in tal caso esci dal ciclo. Ovviamente prima di cominciare il ciclo la variabile in questione va resettata.
    Vorrei aggiungere che in tal modo il ciclo Do...While con il DoEvents rallenterà parecchio le sue performance.

    Inoltre consiglio di creare un Button che servirà ad interrompere il ciclo ed associarlo alla proprietà CancellButton della Form.


    Sbagliare è umano, perseverare è diabolico.

  4. #4
    Originariamente inviato da Pirelli72
    Vorrei aggiungere che in tal modo il ciclo Do...While con il DoEvents rallenterà parecchio le sue performance.
    Questo è indubbio, infatti il metodo migliore sarebbe usando un thread separato; ma se non si sa programmare in multithreading, meglio perdere un po' di performance che trovarsi codice pieno di heisenbug.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Originariamente inviato da comecacchiosifà
    Ciao a tutti.
    La descrizione del problema nel titolo è ottima, ma manca la versione del linguaggio che è obbligatoria, come da Regolamento.

    Qui l'ho aggiunta io, in futuro pensaci tu.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Davvero tutti molto gentili e molto utili i vostri consigli.
    Vi ringrazio.

    Non essendo un programmatore esperto non ho potuto usare la tecnica 'multithreading' ma la dritta sul DoEvents e quella sul pulsante Cancel mi hanno accesso una lampadina e ho fatto semplicemente così:

    While myReader.Read()
    Application.DoEvents()
    articoloRilevato = myReader.GetInt32(0)
    '.....
    End While

    Non noto neppure rallentamenti significativi. Dal momento che è un form di dialogo sono presenti il pulsante OK e Cancel, l'aggiunta dell'istruzione 'Application.DoEvents' mi da finalmente la possibilità di attendere la pressione del pulsante Cancel (o ESC), e il gioco è fatto. Senza quella istruzione il programma si isolava fino al termine del ciclo While.

    Mi scuso con Marco Breveglieri e lo ringrazio; il linguaggio è Visual Basic sto usando Visual Studio 2008, pensavo che fosse un forum solo di Visual Basic. Prossimamente specificherò.

    Cari saluti a tutti.

  7. #7
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.