none
Esecuzione codice in apertura Form RRS feed

  • Domanda

  • Buongiorno, .....ennesimo problema :((
    In apertura del programma carico  una Form   (tipo Splash) che esegue un controllo e pulizia di alcuni processi (Process) se attivi, il problema è che la Form  viene mostrata solo DOPO aver eseguito il codice ma avendo messo una ProgressBar che si incremento mano a mano che leggo i vari Process non la si vede.
    Ho provato a mettere dei ritardi con un timer...ma nulla
    Ho provato a stoppare il codice con Threading.Thread.Sleep(ValoreAttesa)...ma nulla
    Ho provato a gestire il codice nell'evento .shown ma...nulla

    La Form è segnalata nella TaskBar ma appare (visibile) SOLO dopo aver eseguito il codice di controllo processi.

    La idea è che il codice venga eseguito solo DOPO che la Form è completamente visibile....Qualche idea???

    Grazie mille


    • Modificato NewContex domenica 12 aprile 2020 08:32
    domenica 12 aprile 2020 07:24

Risposte

  • Io resto dell'idea che per fare una cosa fatta bene dovresti gestire un thread secondario e lasciar fare a lui quello che fai con PulisciThread.

    Se la vuoi semplificare al massimo, metti un timer, impostato ad esempio a 200 ms, chiami lo start del timer nell'evento Shown, e al Tick del timer, lanci PulisciThread.

    E' un modo per girare intorno al problema, quindi la scelta sarebbe usare un thread secondario, ma vedi tu.

    • Contrassegnato come risposta NewContex lunedì 13 aprile 2020 10:16
    lunedì 13 aprile 2020 09:50

Tutte le risposte

  • senza vedere una riga di codice non è facile capire cosa hai fatto
    domenica 12 aprile 2020 08:53
  • Il codice non è importante...posso dire che ho una sub per fare delle cose, e questa sub  vorrei che venisse eseguita solo DOPO che la form è completamente visibile e questo proposito ho provato a chiamare questa sub in vari eventi della Form (.Load, .Activate, .Shown) ma senza esito...cioè la sub (il codice dentro della sub) viene eseguito prima di VEDERE la form.

    Spero di aver illustrato bene il problema.

    domenica 12 aprile 2020 08:59
  • ....ho provato a chiamare questa sub in vari eventi della Form (.Load, .Activate, .Shown) ma senza esito...

    Questo non lo avevi detto, comunque immagino che sia la prima volta che ti capita, quindi il codice è importante.
    domenica 12 aprile 2020 09:39
  • Per lanciare una sub solo dopo che la form è diventata visibile, devi, come hai scritto, lanciarla nell'evento Shown. L'evento Shown viene alzato la prima volta (e solo la prima) che una form viene mostrata.

    Il fatto che non vedi il risultato grafico di quello che hai fatto, è che probabilmente (darai conferma se effettivamente è così) lanci le varie operazioni, quindi pulizia dei processi e quant'altro) nello stesso thread che usi per disegnare la form, e cioè il thread principale.

    Se il thread è impegnato a "fare" delle cose, non ti aggiorna la parte grafica della form.

    Per risolvere, io lancerei le varie operazioni in un thread secondario, tramite degli eventi segnalerei alla form che le varie azioni stanno procedendo. A quel punto, il thread principale è libero, ed è in grado di aggiornare la form, mostrandoti quello che sta succedendo.

    domenica 12 aprile 2020 09:52
  • Quale codice vuoi vedere, quello che fa la sub chiamata o dove inserisco la chiamata? perchè quello che fa la sub non è importante ad esempio:

    Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            CaricaDati()
        End Sub

    Private Sub CaricaDati()
        msgbox("CIAO")
    end Sub

    Quindi il problema non è il codice che viene eseguito ma quando viene eseguito ossia  io voglio che venga eseguito SOLO quando VEDO la form completa a video.

    Spero di aver illustrato il problema.



    • Modificato NewContex domenica 12 aprile 2020 09:55
    domenica 12 aprile 2020 09:54
  • ma così funziona

        Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
            CaricaDati()
        End Sub

        Private Sub CaricaDati()
            MsgBox("CIAO")
        End Sub



    • Modificato patel45 domenica 12 aprile 2020 12:00
    domenica 12 aprile 2020 11:52
  • Non Funziona come io voglio!!!.... la form appare DOPO aver eseguito la sub...prova a mettere un punto d'interruzione alla riga del MsgBox e vedrai che la form non appare fintanto che il codice non prosegue...quello che io voglio che APPAIA PRIMA la form POI l'esecuzione della sub....
    • Modificato NewContex domenica 12 aprile 2020 13:48
    domenica 12 aprile 2020 13:46
  • a me compare prima il form in ambedue i casi

    Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
    System.Threading.Thread.Sleep(5000)
    CaricaDati()
    End Sub

    Private Sub CaricaDati()
    'System.Threading.Thread.Sleep(5000)
         MsgBox("CIAO")
    End Sub

    domenica 12 aprile 2020 14:33
  • NewContext, hai letto quello che ti ho scritto prima?

    Cosa ne pensi?

    domenica 12 aprile 2020 16:24
  • Ciao  vbMizio, ho letto ma non mi è molto chiaro da dove fare le chiamate alle sub...cmq spiego come ho strutturato la form:

    Ho una sub (  CaricaDati() ) che inizializza i vari controlli assegnando  i testi a delle etichette..sono solo 4 (Labels), poi lancio la sub (   PulisciThread()  ) di pulizia dei vari processi di EXCEL rimasti aperti. Questa sub l'ho messa in un modulo pubblico.

    In questa form ho una ProgresBar che mi mostra lo stato di avanzamento di ricerca nei vari Processi attivi che viene aggiornata dalla sub PulisciThread().

    Nell'evento Form.shown ho inseriro la chiamata a CaricaDati() e all'interno della sub richiamo la sub PulisciThread().

    Ecco...tutto funziona ma fintanto che la sub PulisciThread() non termina si vede solamente la ProgresBar che avanza e solo al termine appare la form completa.

    LA Form ha una immagine png di fondo molto piccola di 50 Kb quindi non influisce sulla velocità di caricamento.

    Ecco tutto...






    • Modificato NewContex lunedì 13 aprile 2020 07:52
    lunedì 13 aprile 2020 07:06
  • Ciao,

    In prima battuta, farei due cose diverse.

    La sub CaricaDati la lancerei all'evento Load della form. Una volta finito il caricamento, ti ritrovi con i controlli già popolati. 

    La sub che va a pulire i threads, la lancerei all'evento Shown.

    lunedì 13 aprile 2020 08:44
  • Provato... ma ugualmente appare la Progressbar su fondo bianco che si movimenta e alla fine quando termina la sub PulisciThread() appare la form completa.
    lunedì 13 aprile 2020 09:22
  • Io resto dell'idea che per fare una cosa fatta bene dovresti gestire un thread secondario e lasciar fare a lui quello che fai con PulisciThread.

    Se la vuoi semplificare al massimo, metti un timer, impostato ad esempio a 200 ms, chiami lo start del timer nell'evento Shown, e al Tick del timer, lanci PulisciThread.

    E' un modo per girare intorno al problema, quindi la scelta sarebbe usare un thread secondario, ma vedi tu.

    • Contrassegnato come risposta NewContex lunedì 13 aprile 2020 10:16
    lunedì 13 aprile 2020 09:50
  • Ho provato a mettere un break (Threading.Thread.Sleep(1000)) ma non cambia nulla se non di farmi aspettare di piu...però sempre appare la ProgresBar e poi la Form alla fine.

    Con un Timer funziona...però è più interessante la tua proposta:

    "Io resto dell'idea che per fare una cosa fatta bene dovresti gestire un thread secondario e lasciar fare a lui quello che fai con PulisciThread."

    Mi informo su come fare!

    Grazie


    • Modificato NewContex lunedì 13 aprile 2020 10:37
    lunedì 13 aprile 2020 09:59