|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#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?
__________________
|
|
|
|
|
|
#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 |
|
|
|
|
|
#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ò
__________________
|
||||
|
|
|
|
|
#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 |
|
|
|
|
|
|
#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?
__________________
|
|
|
|
|
|
|
#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. |
|
|
|
|
|
|
#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
__________________
|
|
|
|
|
|
|
#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: 22:29.













(con java però








