+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Problema con gli eventi di apertura form

  1. #1
    L'avatar di newcontex
    newcontex non è in linea Novello
    Luogo
    Modena
    Post
    10

    Problema con gli eventi di apertura form

    Buongiorno,
    ho un problema di tempistica sulla visualizzazione di alcuni controlli di tipo TextBox all'apertura di una Form.
    Spiego il problema:
    Ho una Form di tipo Splash che deve pulire eventuali Processi rimasti aperti.
    In questa Form, prima di effettuare la ricerca di eventuali processi da pulire, carico alcune TextBox con i dati presenti in Resources come: NomeProgramma, Autore, ecc. ecc.
    Poi lancio la routine di pulizia mostrando l'avvanzamento della ricerca dei processi tramite una ProgressBar.
    Tutto funziona ma l'esecuzione della routine di pulizia è talmente veloce (credo) che la ProgressBar non termina di completare il suo ciclo (ossia la lineetta verde di avanzamento arriva alla metà nonostante che il suo valore sia uguale al valore massimo definito) e anche i contenuti delle TextBox vengono mostrate alla fine del processo anche se assegno loro i rispettivi valori PRIMA di "lanciare" la routine di pulizia.
    Ho messo dei tempi di attesa e cicli di ritardo ma nonostante questi ritardi i controlli vengono sempre mostrati in ritardo, invece vorrei che la routine di pulizia avvenisse DOPO che i controlli visualizzino i dati e che la lineetta verde della ProgressBar raggiunga il massimo del suo valore alla fine della routine di pulizia.

    Ecco il codice:
    codice:
    Public Class FrmProcessi
    
      Private Sub FrmProcessi_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            CaricaDati()
        End Sub
    
      Private Sub FrmProcessi_Shown(sender As Object, e As EventArgs) Handles Me.Shown
                 PulisciThread()
        End Sub
    
    Private Sub CaricaDati()
            LbAutore.Text = My.Application.Info.CompanyName
            LbNomeSoftware.Text = My.Application.Info.AssemblyName
            LbVersione.Text = My.Application.Info.Version.ToString
            LbData.Text = Format(Now(), "dd/mm/yyyy")
            LbOrario.Text = Format(Now(), "hh:mm")
      
            Threading.Thread.Sleep(5)
        End Sub
    
      Private Sub PulisciThread()
    
            Cursor = Cursors.WaitCursor
            Dim MyProcesses() As Process = Process.GetProcesses()
            Dim myProcess As Process
            Dim nProcessi As Integer
            nProcessi = MyProcesses.Length - 1
    
            With ProgBar
                .Minimum = 0
                .Maximum = nProcessi + 1
                .Value = 0
                .Style = ProgressBarStyle.Continuous
            End With
    
            Dim x As Integer = 1
            Dim nExcel As Integer = 0
    
            For Each myProcess In MyProcesses
                If myProcess.ProcessName = "EXCEL" Then
                    nExcel += 1
                    myProcess.Kill()
                End If
    
                x += 1
                ProgBar.PerformStep()
                Threading.Thread.Sleep(2)
    
            Next
           Attesa(500, nExcel)
         End Sub
    
      Private Sub Attesa(nAttesa As Long, ByRef nkill As Integer)
            Threading.Thread.Sleep(nAttesa)
            Label2.Text = "Processo di pulizia effettuato! " & CStr(nkill.ToString) & " chiuse....Avvio del Programma"
            Label2.Visible = True
            'Inizio Conto alla rovescia per 5 secondi
            Timer1.Enabled = True
        End Sub
    
      Private Sub ContaSecondiToEnd(sender As Object, e As EventArgs) Handles Timer1.Tick
            If SecondiToClose > 0 Then
                SecondiToClose -= 1
            Else
                Me.Close()
            End If
       End Sub
    
    End Class
    Sperando che questo thread venga pubblicato (cosa che non è avvenuto con un'altro thread e non so il perchè), ringrazio anticipatamente chi vorrà darmi alcune dritte o soluzioni a questo problema.
    Grazie

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,614
    Blogs
    5
    La Sleep blocca il thread e anche la visualizzazione.

    Al posto di

    Threading.Thread.Sleep(2)

    usa una

    Application.DoEvents

    e utilizza una DoEvents anche nella Sub Attesa
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    L'avatar di newcontex
    newcontex non è in linea Novello
    Luogo
    Modena
    Post
    10
    Grazie per la riposta AntonioG,
    ho cambiato il Thread.Sleep(x) in Application.DoEvents() e devo dire che le TextBox ora vengono visualizzate abbastanza bene nei tempi giusti ma la ProgressBar non ne vuole sapere di aggiornarsi al variare di x, anzi la 'barretta' non si muove per niente

  4. #4
    L'avatar di newcontex
    newcontex non è in linea Novello
    Luogo
    Modena
    Post
    10
    RISOLTO: Cambiando lo STYLE della ProgressBar in Marquee e diminuendo il MarqueeAnimationSpeed oltre a inserire le Application.DoEvents() al posto del Thread.Sleep().

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi