n° 219
Novembre 2017
Dicembre 11, 2017, 01:22:11 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Timer in WPF  (Letto 5680 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
systemgvp
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 16


Mostra profilo E-mail
« inserita:: Agosto 17, 2010, 04:14:00 »

Salve,

volendo cercare di capire come utilizzare i Timer in WPF ho scritto il seguente e semplice codice:

Codice:
private void button1_Click(object sender, RoutedEventArgs e)
{
    System.Timers.Timer aTimer = new System.Timers.Timer();
    aTimer.Interval = 2000;
    aTimer.Elapsed += new System.Timers.ElapsedEventHandler(aTimer_Elapsed);
    aTimer.Start();
}

void aTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    label1.Content = DateTime.Today.Second.ToString();
}


il problema è che mi da un errore dicendomi che l'oggetto Label1 fa parte di un altro trhead, è mi sembra logico, ma come faccio a condividerlo?
Registrato
Mitzuashi
Jr. Member
**

Karma: +3/-0
Scollegato Scollegato

Messaggi: 53


Mostra profilo
« Risposta #1 inserita:: Agosto 18, 2010, 08:47:30 »

Ciao,
prova
Codice:
aTimer.SynchronizingObject = label1;

dove ovviamente label1 è l'oggetto da sincronizzare.
Non uso WPF ma il System.Timers.Timer è sempre quello.

Spero ti sia utile
Registrato
systemgvp
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 16


Mostra profilo E-mail
« Risposta #2 inserita:: Agosto 20, 2010, 01:15:48 »

non funziona, mi da errore segnandomi in rosso "label1"
Registrato
amdbook
Hero Member
*****

Karma: +11/-1
Scollegato Scollegato

Messaggi: 1662



Mostra profilo WWW
« Risposta #3 inserita:: Agosto 20, 2010, 02:04:11 »

Modifica il codice in questo modo:

Codice:
       private void button1_Click(object sender, RoutedEventArgs e)
        {
            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Interval = 2000;
            aTimer.Elapsed += new System.Timers.ElapsedEventHandler(aTimer_Elapsed);
            aTimer.Start();
        }

        public delegate void onTimeElapsedDelegate();

        void aTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            writeLabelContent();
        }

        private void writeLabelContent()
        {
            if (label1.Dispatcher.Thread == Thread.CurrentThread)
            {
                ////Visualizza i secondi.
                label1.Content = DateTime.Now.ToString("ss");
            }
            else
            {
                onTimeElapsedDelegate timeElapsedDelegate = new onTimeElapsedDelegate(writeLabelContent);
                label1.Dispatcher.BeginInvoke(timeElapsedDelegate, null);
            }
        }

In WPF, nelle applicazioni multi-thread, per accedere alla "proprietà" di un elemento che non è stato creato dallo stesso thread "chiamante" puoi utilizzare l'istanza della classe System.Threading.Dispatcher, esposta dall'elemento interessato tramite l'omonima proprietà.
Registrato
systemgvp
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 16


Mostra profilo E-mail
« Risposta #4 inserita:: Agosto 21, 2010, 01:40:51 »

grazie, era quello che cercavo
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines