| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  07-02-2008, 17:03 | #1 | 
| Senior Member Iscritto dal: Jul 2002 Città: Reggio Calabria -> London 
					Messaggi: 12112
				 | 
				
				[.NET] Windows forms e modal dialogs...
			 
		Come si fanno a visualizzare 'sti benedetti dialoghi modali con i windows forms? ho provato a fare così: Codice: private void copyAllWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            waitDialog = new WaitDialog();
            Application.Run(waitDialog);
            waitDialog.ShowDialog(this);
            foreach (string watchedDir in watchedDirsListbox.Items)
            {
                waitDialog.currentDirectory.Text = "Copia di " + watchedDir;
                .......
            }
        }
        private void copyAllWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            waitDialog.Dispose();
        }Accade questo: 1) Il dialogo non è modale. 2) Mi impalla tutto. Prima non mi veniva nemmeno visualizzato perchè non utilizzavo Application.run(), mentre ora viene visualizzato ma haquesto comportamento non desiderato. Tenendo conto che lo sto lanciando da un thread diverso da quello dell'Event Listener grafico di windows, c'è qualche altra operazione particolare da fare oltre ad Application.run? In pratica mi servirebbe qualcosa come lo SkingUtilities.invokeLater() di java credo... Qualcuno ha idea di cosa sto sbagliando?   
				__________________   | 
|   |   | 
|  07-02-2008, 21:17 | #2 | 
| Senior Member Iscritto dal: Jan 2000 Città: Provincia di Parma 
					Messaggi: 724
				 | 
		Non conosco il contesto dell'applicazione, ma ci sono diverse cose che non quadrano: 1. Non puoi dichiarare una variabile "waitDialog" locale ad un metodo, e poi farne la dispose in un altro. 2. Da quanto vedo stai usando il BackgroundWorker, quindi innanzitutto il tuo dialog modale WaitDialog va istanziato dall'applicazione principale con un waitDialog.ShowDialog() e non nel worker, e deve girare nel thread della form proncipale. 3. Il tuo WaitDialog sarà quello che eseguirà il "lavoro sporco", quindi sarà lui il detentore del BackgroundWorker (a meno che non ti serva anche da altre parti). 4. Il BackgroundWorker del tuo WaitDialog dovrà sottoscriversi agli eventi DoWork, RunWorkerCompleted e, se vuoi riportare un progresso, ProgressChanged, dove, nel primo fai i tuoi lavori. 5. Il processo inizia invocando il metodo RunWorkerAsync() del BackgroundWorker. Spero di aver centrato la cosa... 
				__________________ My Pc: Case Enermax Chakra - PSU Corsair HX520 - Gigabyte P35-DS3R - Core2 Duo E6550 - 6 Gb RAM Geil PC800 - 2x WD Caviar SE 320Gb (Raid1) - Xfx GeForce 8600Gt - Master Pioneer DVR111D - Samsung SM T220 - S.O. Windows 7 Ultimate x64 SP1 My blog: http://blogs.ugidotnet.org/alby | 
|   |   | 
|  07-02-2008, 23:12 | #3 | ||||
| Senior Member Iscritto dal: Jul 2002 Città: Reggio Calabria -> London 
					Messaggi: 12112
				 | Quote: 
  Quote: 
 ..ma quindi con le window forms non è possibile lanciare componenti grafici dal thread diverso da quello del gestore degli eventi?  In java si fa tranquillamente  Quote: 
 Per ora ho reso "master" il background worker che mi uccideva con un dispose il dialogo modale quando finiva il suo compito... Quote: 
  grazie per l'aiuto  e ora di nuovo al lavoro..  (con java però  ) 
				__________________   | ||||
|   |   | 
|  08-02-2008, 12:03 | #4 | |
| Senior Member Iscritto dal: Jan 2000 Città: Provincia di Parma 
					Messaggi: 724
				 | Quote: 
  Non puoi accedere agli oggetti grafici da un thread diverso da quello in cui gira l'interfaccia utente. Devi usare il metodo Invoke() pssando un delegate come parametro. 
				__________________ My Pc: Case Enermax Chakra - PSU Corsair HX520 - Gigabyte P35-DS3R - Core2 Duo E6550 - 6 Gb RAM Geil PC800 - 2x WD Caviar SE 320Gb (Raid1) - Xfx GeForce 8600Gt - Master Pioneer DVR111D - Samsung SM T220 - S.O. Windows 7 Ultimate x64 SP1 My blog: http://blogs.ugidotnet.org/alby | |
|   |   | 
|  08-02-2008, 20:49 | #5 | |
| Senior Member Iscritto dal: Jul 2002 Città: Reggio Calabria -> London 
					Messaggi: 12112
				 | Quote: 
 Infatti per questo chiedevo dell'equivalente per c# di SkingUtilities.invokeLater() che si occupa proprio di effettuare cambiamenti a componenti grafici da un thread diverso in maniera corretta... e mi sa che il tuo ultimo post ha risposto alla mia domanda  Come funziona quindi questo metodo Invoke() .. o meglio.. dove lo trovo?   
				__________________   | |
|   |   | 
|  09-02-2008, 14:35 | #6 | |
| Senior Member Iscritto dal: Jan 2000 Città: Provincia di Parma 
					Messaggi: 724
				 | 
		
Il runtime .NET solleva un eccezione sicuramente, quindi non ti permette di farlo. Quote: 
 Il BackgroundWorker, internamente, utilizza questo metodo per gestire l'evento ProgressChanged, dove, nel gestore associato all'evento, puoi accedere ai controlli in modo thread safe. Ad esempio: Codice: private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // progressBar1 è un controllo ProgressBar all'interno della form
    this.progressBar1.Value = e.ProgressPercentage; 
}
				__________________ My Pc: Case Enermax Chakra - PSU Corsair HX520 - Gigabyte P35-DS3R - Core2 Duo E6550 - 6 Gb RAM Geil PC800 - 2x WD Caviar SE 320Gb (Raid1) - Xfx GeForce 8600Gt - Master Pioneer DVR111D - Samsung SM T220 - S.O. Windows 7 Ultimate x64 SP1 My blog: http://blogs.ugidotnet.org/alby Ultima modifica di Einstein : 09-02-2008 alle 14:37. | |
|   |   | 
|  09-02-2008, 14:42 | #7 | |
| Senior Member Iscritto dal: Jul 2002 Città: Reggio Calabria -> London 
					Messaggi: 12112
				 | Quote: 
 finora non me l'ha mai sollevata l'eccezione  in pratica cambiavo il testo di una label direttamente dal doWork del backgroundworker.... cosa che sapevo essere sbagliatissima, però a quanto pare funzionava  Ora che so dell'esistenza di invoke lo cambierò in quel modo oppure implementerò il metodo ProgressChanged (che non avevo ancora fatto perchè è in una storia successiva  ) 
				__________________   | |
|   |   | 
|  09-02-2008, 15:44 | #8 | 
| Senior Member Iscritto dal: Jan 2000 Città: Provincia di Parma 
					Messaggi: 724
				 | 
		Se lo fai dal BackgroundWorker, ok, ma perché è lui che ti pone in un contesto thread safe... Se lo fai fuori dal BackgroundWorker, hai un'eccezione (a meno di non usare Invoke()).
		 
				__________________ My Pc: Case Enermax Chakra - PSU Corsair HX520 - Gigabyte P35-DS3R - Core2 Duo E6550 - 6 Gb RAM Geil PC800 - 2x WD Caviar SE 320Gb (Raid1) - Xfx GeForce 8600Gt - Master Pioneer DVR111D - Samsung SM T220 - S.O. Windows 7 Ultimate x64 SP1 My blog: http://blogs.ugidotnet.org/alby Ultima modifica di Einstein : 09-02-2008 alle 15:46. | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 11:54.









 
		 
		 
		 
		








 
  
 



 
                        
                        










