![Avatar](/data/images/profiles/users/default.png)
danielerew (Normal User)
Newbie
![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 15
Iscritto: 10/06/2011
|
Buongiorno,
Ho una domanda:
Ho creato tramite delegate e event una funzione che a tempo restituisce delle cose.
L unico neo è che non riesco a fermarla dopo che viene ripristinata l app dalla notifyIcon.
Vi faccio un esempio: 1 form 2 pulsanti 1 stop e uno start + 1 input box dove visualizzo l orologio
1 orologio che ogni secondo crea un evento.e lo faccio partire con un bottone start.
2 metto un output dell orologio nella console e nel inputbox (visualizzo tutto correttamente e se premo il pulsante stop si ferma)
3 creo una notifyicon e la faccio partire di conseguenza il servizio orologio continua a funzionare
4 ripristino l app premendo l la notifyicon e chiaramennte non posso fermare l evento fatto partire in precedenza con il pulsante stop perche l oggetto non è valido
"errore di chiusura ticker stop europeoSystem.NullReferenceException: Riferimento a un oggetto non impostato su un'istanza di oggetto"
Domanda come posso risolvere il problema della chiusura evento fatto partire in precedenza? ho provato diverse strade ma sono poco funzionali.
ringrazio in anticipo per qualsiasi consiglio
ciao
daniele
Ultima modifica effettuata da danielerew il 18/07/2011 alle 6:06 |
|
![Avatar](/data/images/profiles/users/Il Totem_pi_piccolo.jpg)
Il Totem (Admin)
Guru^2
![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png)
Messaggi: 3635
Iscritto: 24/01/2006
|
Non è chiaro. Non puoi "aprire" o "chiudere" un evento. Si tratta di un'azione istantanea: esso viene lanciato dal sender e catturato dal listener. Magari ti stavi riferendo all'aggiunta o alla rimozione di un gestore d'evento?
|
|
![Avatar](/data/images/profiles/users/default.png)
danielerew (Normal User)
Newbie
![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 15
Iscritto: 10/06/2011
|
si intendevo quella.
in pratica l evento lanciato che produce i suoi effetti continua il suo loop.
ti posto un esempio della logica di codice cosi capisci meglio:
#######################################
public void StartEuClock()
{
this.ticker = new DispatcherTimer();
this.ticker.Tick += this.OnTimedEvent;
this.ticker.Interval = new TimeSpan(0, 0, 10); // 10 second
this.ticker.Start();
}
public void StopEuClock()
{
try
{
this.ticker.Stop();
}
catch (Exception f)
{
Console.WriteLine("errore di chiusura ticker stop europeo" + f);
if (ticker != null)
this.ticker.Stop();
}
}
queste sono 2 funzioni tipo collegate hai due pulsanti ...in conseguenza dopo la ripresa della notyfiicon ho creato una funzione con questo che viene lanciato alla ripresa della notifyicon
function void stoptutto {
ticker.Stop();
}
ma non funziona perche chiaramente dice che manca il riferimento all oggetto.
Hai soluzioni come intercettare l evento ticker.Start(); avviato e fermarlo?
Ps. quando parte il ticker.Start() do il via ad un altra funzione...inizialmente pensavo di bloccare solo quella ma non riesco ad intercettarla pero se riuscissi a stoppare il loop avviato di conseguenza si dovrbbe fermare tutto..
Ciao e grazie
Daniele
################
Ultima modifica effettuata da danielerew il 19/07/2011 alle 2:31 |
|
![Avatar](/data/images/profiles/users/Il Totem_pi_piccolo.jpg)
Il Totem (Admin)
Guru^2
![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png)
Messaggi: 3635
Iscritto: 24/01/2006
|
Non capisco perché sia tanto ovvio che ticker sia null. Se fosse nullo, allora non potrebbe lanciare l'evento, a meno che tu non abbia creato un memory leak che tiene in vita l'oggetto DispatcherTimer nonostante il riferimento ticker sia stato annullato.
Se sei sicuro che ticker sia null, allora da qualche parte devi pur averlo impostato. Perciò nel codice che si occupa di eliminare il riferimento all'oggetto da ticker, basta che rimuovi anche il gestore d'evento associato:
Codice sorgente - presumibilmente Plain Text |
ticker.Tick -= OnTimedEvent;
|
|
|
![Avatar](/data/images/profiles/users/default.png)
danielerew (Normal User)
Newbie
![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 15
Iscritto: 10/06/2011
|
Scarica il programma dal link ho creato un esempio della logica della cosa.
1 quando fai partire e metti in background vedrai che la console ti stampa l ora principale ed un altra CHE PARTE DOPO 10 secondi
2 premi il pulsante che mette in background vedrai che nella console continua a funzionare i 2 eventi creati
3 premi doppio click sull icona e prova a fermare l evento non ho messo l evento dentro ad un blocco try quindi ti dara errore.
Download programma esempio
http://danielerewstudios.com/ftpfiles/WpfApplication9.zip
ciao e grazie
Daniele
|
|
![Avatar](/data/images/profiles/users/Il Totem_pi_piccolo.jpg)
Il Totem (Admin)
Guru^2
![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png)
Messaggi: 3635
Iscritto: 24/01/2006
|
Ho capito qual è il problema e non c'entra con i tuoi orologi. Si tratta di un errore concettuale che ha origine in Component1.cs:
Codice sorgente - presumibilmente C# / VB.NET |
private void Restore()
{
notifyIcon1.Visible = false;
MainWindow main;
main = new MainWindow();
main.Show();
//main.WindowState = WindowState.Normal;
}
|
Qui tu crei una nuova finestra MainWindow, perciò crei un memory leak spaventoso, oltre al tuo errore. Infatti ogni volta che clicchi Run in Background, la finestra viene nascosta, ma non distrutta, quindi continua ad esistere in memoria. Parallelamente crei anche una nuova notifyicon ogni volta e quando fai doppio click su quest'ultima, crei ancora un'altra finestra, e così via...
L'eccezione è dovuta al fatto che istanzi una nuova MainWindow, in cui non hai mai fatto partire i timer: perciò i loro membri privati ticker sono ancora null.
La soluzione è usare una sola MainWindow per tutta l'applicazione: puoi anche portare la notifyIcon nella stessa MainWindow, senza dover creare un controllo ausiliario esclusivamente per lei.
|
|
![Avatar](/data/images/profiles/users/default.png)
danielerew (Normal User)
Newbie
![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 15
Iscritto: 10/06/2011
|
infatti è proprio quello il problema me ne sono accorto sta notte ho fatto delle prove lavorando con lo state.
Sto lavorando con la wpf da poco e il controllo notifyicon è nei componet form per quello ho creato un file esterno.
Puoi darmi qualche dritta ? per risolvere i 2 problemi?
Ad esempio ho tentato anche questa strada:
###########nella funzione closing
if (this.WindowState != FormWindowState.Minimized)
{
e.Cancel = true;
this.WindowState = WindowState.Minimized;
notifyIcon1.ShowBalloonTip(3000, "Test ",
"Ybla bla."+
(Char)(13)+"bla bla."+
(Char)(13)+"bla blabla.",
ToolTipIcon.Info);
}
#####################nel restore
private void notifyIcon1_DoubleClick(object sender, EventArgs e)
{
if (this.WindowState == WindowState.Minimized)
{
this.Show();
this.WindowState = WindowState.Normal;
}
// Activate the form.
this.Activate();
this.Focus();
}
##############################
ma non va il ripristino rimane minimazed e basta.
Ciao e grazie
Daniele
Ultima modifica effettuata da danielerew il 20/07/2011 alle 18:38 |
|
![Avatar](/data/images/profiles/users/Il Totem_pi_piccolo.jpg)
Il Totem (Admin)
Guru^2
![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png) ![](/data/images/stars/yellow.png)
Messaggi: 3635
Iscritto: 24/01/2006
|
Magari WindowState non è Minimized, anche se può sembrare strano. In quel caso l'if non verrebbe eseguito...
|
|
![Avatar](/data/images/profiles/users/default.png)
danielerew (Normal User)
Newbie
![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png) ![](/data/images/stars/gray.png)
Messaggi: 15
Iscritto: 10/06/2011
|
penso che l unica soluzione sia quella d integrare la classe component dento a Mainwindow cosi non istanzio un nuovo oggetto il problema è che l ereditarieta non ha possibilita simultanee multiple a quanto so
Almeno non credo sia possibile una cosa del genere
Mainwindow: window
Component1 : Mainwindow , Component
di norma l ered procede in modo differente
Mainwindow: window
Component1 : Mainwindow
ciao e grazie
daniele
Ultima modifica effettuata da danielerew il 21/07/2011 alle 13:21 |
|