Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [VB 2008] - Ciclo FOR troppo veloce. Come rallentarlo?

    Ciao, ho creato un ciclo FOR semplicissimo, per visualizzare il valore dell'indice ciclato in una casella di testo.
    Purtroppo è talmente veloce che vedo comparire direttamente l'ultimo valore.

    Come posso rallentare il ciclo, per visualizzare i valori scattare uno alla volta????


    codice:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            
    For k As Integer = 0 To 100
                TextBox1.Text = k.ToString
    Next
    
    End Sub
    Ciao e grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    148

    Re: [VB 2008] - Ciclo FOR troppo veloce. Come rallentarlo?

    Originariamente inviato da PRICIPIANTE
    Ciao, ho creato un ciclo FOR semplicissimo, per visualizzare il valore dell'indice ciclato in una casella di testo.
    Purtroppo è talmente veloce che vedo comparire direttamente l'ultimo valore.

    Come posso rallentare il ciclo, per visualizzare i valori scattare uno alla volta????


    codice:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            
    For k As Integer = 0 To 100
                TextBox1.Text = k.ToString
    Next
    
    End Sub
    Ciao e grazie in anticipo
    evita il FOR e usa un timer!

  3. #3
    Vorrei rallentare proprio il ciclo FOR.
    E' un esempio di una cosa più complessa che sto realizzando

    Mi hanno consigliato di usare per ex
    Thread.Sleep(500)

    per congelare il cicolo per mezzo secondo.
    Effettivamente il ciclo si congela; però non visualizza il valore nella casella di testo.


    Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Temo proprio che non sia la velocità di esecuzione che non ti permetta il refresh della Textbox.
    Finchè la routine non giunge a termine temo che tu debba forzare il refresh del controllo.Prova a usare il metodo .Refresh della TextBox, ovviamente il refresh del controllo fa perdere prestazioni al ciclo For..Next.
    Sbagliare è umano, perseverare è diabolico.

  5. #5
    intendevi di usarlo in questo modo??

    Comunque non succede nulla.
    Possibile che questi programmi non facciano mai ciò che uno si aspetta che facciano?

    Cavolo, TextBox1.Text = k.ToString, fa parte dei comandi che gli dico di eseguire; me lo dovrebbe ripetere 100 volte e non saltare alla fine del ciclo. Roba da matti. eheheh

    Ciao


    codice:
            For k As Integer = 0 To 100
                TextBox1.Text = k.ToString
                TextBox1.Refresh()
            Next

  6. #6
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Scusa, prova così:

    codice:
            For k As Integer = 0 To 100
                TextBox1.Text = k.ToString
                TextBox1.Refresh()
                System.Threading.Thread.Sleep(700)
            Next
    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  7. #7
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    In aggiunta al mio post precedente...
    Originariamente inviato da PRINCIPIANTE:
    Possibile che questi programmi non facciano mai ciò che uno si aspetta che facciano?
    Non è colpa del programma, ma di chi lo scrive...

    Originariamente inviato da PRINCIPIANTE:
    Cavolo, TextBox1.Text = k.ToString, fa parte dei comandi che gli dico di eseguire; me lo dovrebbe ripetere 100 volte e non saltare alla fine del ciclo.
    ed infatti lo ripete cento volte, solo che lo fa ad una velocità tale che tu non lo vedi; per quello nel mio post precedente ti ho consigliato di aggiungiere la riga

    codice:
    System.Threading.Thread.Sleep(700)
    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Cavolo, TextBox1.Text = k.ToString, fa parte dei comandi che gli dico di eseguire; me lo dovrebbe ripetere 100 volte e non saltare alla fine del ciclo. Roba da matti. eheheh


    Ma secondo te quanto può durare un ciclo che conta fino a 100 e visualizza il contatore in una TextBox alla massima velocità disponibile di una CPU di oggi???
    Secondo me meno di un decimo di un millesecondo, se tu riesci a vedere l'incremento sulla TextBox a quella velocità ti faccio i miei complimenti.
    Sbagliare è umano, perseverare è diabolico.

  9. #9
    Utente di HTML.it L'avatar di ShaleN
    Registrato dal
    Aug 2010
    Messaggi
    517
    Originariamente inviato da Pirelli72
    Ma secondo te quanto può durare un ciclo che conta fino a 100 e visualizza il contatore in una TextBox alla massima velocità disponibile di una CPU di oggi???
    Secondo me meno di un decimo di un millesecondo, se tu riesci a vedere l'incremento sulla TextBox a quella velocità ti faccio i miei complimenti.
    Hai pienamente ragione.
    Le vie del Signore sono infinite. È la segnaletica che lascia a desiderare.
    La luce viaggia più veloce del suono. Per questo alcune persone sembrano brillanti finchè non parlano.
    Occhio per occhio uguale... occhio al quadrato

  10. #10
    Se non puoi gestire la questione tramite un timer, ma hai la necessità (per non so quale motivo) di gestire il tutto tramite un for, l'approccio più pulito è eseguire il for in un thread a parte usando senza problemi la Thread.Sleep (il thread a parte serve infatti per non bloccare il thread principale, e in particolare il message loop, così che la finestra non diventi "bloccata").
    Tuttavia, dato che i controlli Windows Forms non sono thread-safe, bisogna usare il metodo Control.Invoke per fare in modo che tutte le modifiche siano di fatto effettuate dal thread principale.
    Originariamente inviato da PRICIPIANTE
    Possibile che questi programmi non facciano mai ciò che uno si aspetta che facciano?

    Cavolo, TextBox1.Text = k.ToString, fa parte dei comandi che gli dico di eseguire; me lo dovrebbe ripetere 100 volte e non saltare alla fine del ciclo. Roba da matti. eheheh
    I programmi fanno esattamente quello che gli dici di fare. Il punto è che la programmazione GUI è complicata, e per quanto il .NET Framework tenti di portarla a livello di principianti, se non sai come funziona "sotto il cofano" è sicuro che ti imbatterai in problemi.

    Nello specifico, come può il sistema ridisegnare la TextBox senza che tu forzi un ridisegno, dato che il thread corrente (e unico) è bloccato nel for e quindi non può processare WM_PAINT?
    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.