Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93

    [C#] come gestire marqueebar + thread in un wizard

    ciao ragazzi mi sto scervellando ma non riesco a trovare una soluzione al mio problema:
    tramite devexpress sto sviulppando un wizard.
    tra una pagina e l'altra chiamo una funzione che salva una serie di files, bloccando la transizione per diversi secondi.questo problema ovviamente l'ho risolto "threadizzando" la funzione di salvataggio.questo fa si che i file vengano salvati separatamente e il wizard passi direttamente alla pagina sucessiva.
    quello che vorrei fare è che la pagina attenda la fine del thread mostrando una marqueebar, e solo dopo il termine di quest'ultimo passi automaticamente alla pagina successiva.
    so che non è uno dei quesiti più semplici ma anche solo una traccia mi farebbe comodo.
    grazie mille

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Scusa non ho capito, allora tu hai utilizzato un Thread separato da quello della UI per fare del lavoro e quindi non bloccare la UI, ma vuoi che la UI, ovvero la tua pagina, si blocchi prima che il Thread non abbia finito il suo lavoro??

    Sbagliare è umano, perseverare è diabolico.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    no non voglio che si blocchi sennò non avrebbe senso una marqueebar (per scorrere, la gui deve essere viva e vegeta ).
    voglio che effettui la transazione alla pagina successiva solo alla fine del thread...spero di essermi spiegato

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Ah ecco.....avevo capito male.
    Dunque se ti serve solo ed esclusivamente che mi muova la ProgressBar ma il resto della UI deve rimanere fermo puoi anche evitare di utilizzare i Thread, nel ciclo in cui devi 'fare qualcosa' basta che utilizzi il Application.DoEvents e sei a posto. Ovviamente però dipende da cosa fai nel ciclo.

    Una soluzione più elegante è quello di utilizzare una classe di appoggio in cui richiamerai la tua Sub/Funzione (ovviamente da far partire in un Thread sparato) e utilizzare poi un'evento per informare la UI della fine del Thread.
    Sbagliare è umano, perseverare è diabolico.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    Originariamente inviato da Pirelli72
    Ah ecco.....avevo capito male.
    Dunque se ti serve solo ed esclusivamente che mi muova la ProgressBar ma il resto della UI deve rimanere fermo puoi anche evitare di utilizzare i Thread, nel ciclo in cui devi 'fare qualcosa' basta che utilizzi il Application.DoEvents e sei a posto. Ovviamente però dipende da cosa fai nel ciclo.

    Una soluzione più elegante è quello di utilizzare una classe di appoggio in cui richiamerai la tua Sub/Funzione (ovviamente da far partire in un Thread sparato) e utilizzare poi un'evento per informare la UI della fine del Thread.
    grazie per la risposta...
    come si usa l'application.doevents()?
    anche io avevo pensato al discorso della gestione dell'evento però sono comunque bloccato, alla ricezione di tale evento come faccio per cambiare pagina??

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da ratal
    grazie per la risposta...
    come si usa l'application.doevents()?
    Inserisci nel ciclo

    codice:
    Application.DoEvents
    Ma ti ripeto, primo non è detto che vada bene al tuo caso perchè non so cosa tu faccia nella tua funzione/sub, secondo diminuiscono decisamente le prestazioni.

    anche io avevo pensato al discorso della gestione dell'evento però sono comunque bloccato, alla ricezione di tale evento come faccio per cambiare pagina??
    Non ne ho idea, sinceramente non ho capito cosa devi fare.
    Se posti il codice che hai scritto forse ti possiamo dare una mano in più.
    Sbagliare è umano, perseverare è diabolico.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    ho fatto una cosa del genere...riduco al minimo il codice per farti capire.questa è la funzione che gestisce il passaggio della pagina (per passare alla successiva e.valid dev'essere true).non passo a quella successiva finchè savfiles nn torna true.
    codice:
    private void wizardPage3_PageValidating(object sender, DevExpress.XtraWizard.WizardPageValidatingEventArgs e)
             {                          
                if (e.Direction == DevExpress.XtraWizard.Direction.Forward)             
                  {                 
                    e.Valid = SaveFiles();                 
                    if (!e.Valid) e.ErrorText = "errore";                      
                   }         
              }
    savfiles è cosi fatto
    codice:
    private bool SaveFiles()         
    {             
                  if (Directory.Exists(this.buttonEdit2.Text))            
                   {                 
                   ParameterizedThreadStart entry = new                                                                                                            ParameterizedThreadStart(this.ThreadingSave);                 
    Thread thread = new Thread(entry);                
     thread.Start(new object[] { (campi che mi servono nel thread)});                                  return true; }             
    else return false;         
    }
    threadingsave effettua il salvataggio di diversi documenti word.quello che voglio fare è che il mio form principale resti sempre vivo (e questo avviene grazie al thread), poi al termine di threadingsave, vorrei far si che avvenga la transizione alla pagina successiva del mio wizard (quindi in qualche modo richiamare page validating e assegnare e.Valid = true).spero di essermi spiegato sta volta

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Sinceramente NO, non ho capito come fai a passare alla pagina successiva. Sicuramente non dopo aver verificato l'argomento e.Valid perchè se è falso dai un messaggio di errore, se è vero non fai niente!
    Oppure se termina wizardPage3_PageValidating senza annullare va automaticamente alla pagina successiva??

    La riga :

    codice:
     e.Valid = SaveFiles();
    non mi sembra corretta perchè sicuramente non aspetta il termine del Thread chiamato.
    Se la directory esiste fa partire il Thread e ritorna True ma non aspetta il termine del Thread, se non esiste ritorna False.
    Sbagliare è umano, perseverare è diabolico.

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    il discorso del page validating funziona cosi:
    valid è impostato a true di default e se non viene modificato significa che è consentito passare alla pagina successiva.la mia funzione o torna false (e quindi impedisce di passare alla pag successiva con conseguente messaggio d'errore) o conferma il true.funziona cosi col wizard di devexpress

    per quanto riguarda il discorso del thread ho scordato un "return true" nel copiare il codice.andrebbe aggiunto nella funzione SaveFiles() dopo aver lanciato il thread.
    detto questo la funzione SaveFiles, se la directory è corretta, lancia il thread e ritorna subito true facendomi andare istantaneamente nella pagina successiva.
    quello che voglio è far si che il passaggio alla pagina successiva avvenga alla fine del thread e non istantaneamente come avviene ora, oppure bloccando il form nel caso non venga utilizzato un thread separato.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da ratal
    il discorso del page validating funziona cosi:
    valid è impostato a true di default e se non viene modificato significa che è consentito passare alla pagina successiva.la mia funzione o torna false (e quindi impedisce di passare alla pag successiva con conseguente messaggio d'errore) o conferma il true.funziona cosi col wizard di devexpress
    Ora ci sono, scusa la mia ignoranza in materia .

    per quanto riguarda il discorso del thread ho scordato un "return true" nel copiare il codice.andrebbe aggiunto nella funzione SaveFiles() dopo aver lanciato il thread.
    detto questo la funzione SaveFiles, se la directory è corretta, lancia il thread e ritorna subito true facendomi andare istantaneamente nella pagina successiva.
    quello che voglio è far si che il passaggio alla pagina successiva avvenga alla fine del thread e non istantaneamente come avviene ora, oppure bloccando il form nel caso non venga utilizzato un thread separato.
    A quel punto una soluzione veloce e indolore senza scrivere troppo potrebbe essere questa:

    codice:
     private void wizardPage3_PageValidating(object sender, DevExpress.XtraWizard.WizardPageValidatingEventArgs e)
            {
                if (e.Direction == DevExpress.XtraWizard.Direction.Forward)
                {
                    if (Directory.Exists(this.buttonEdit2.Text))
                    {
                        System.Threading.Thread myThread = new System.Threading.Thread(SaveFiles);
                        myThread.Start();
                        while (myThread.IsAlive)
                        {
                            System.Threading.Thread.Sleep(2);
                            Application.DoEvents();
                        }
                        e.Valid = true;
    
                    }
                    else
                    {
                        e.Valid = false;
                        e.ErrorText = "errore";    
                    }
                  
                }
            }
    
    
    private void SaveFiles()
            {
                //Tuo codice
            }
    Scusa ho modificato il tuo in un semplice Thread
    Sbagliare è umano, perseverare è diabolico.

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.