Oppure

Loading
18/07/11 4:04
danielerew
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 18/07/11 4:06
aaa
18/07/11 8:49
Il Totem
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?
aaa
19/07/11 0:28
danielerew
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 19/07/11 0:31
aaa
19/07/11 8:22
Il Totem
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:
ticker.Tick -= OnTimedEvent;
aaa
19/07/11 17:48
danielerew
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

danielerewstudios.com/ftpfiles/…

ciao e grazie
Daniele
aaa
20/07/11 10:16
Il Totem
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:
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.
aaa
20/07/11 16:15
danielerew
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 20/07/11 16:38
aaa
21/07/11 8:16
Il Totem
Magari WindowState non è Minimized, anche se può sembrare strano. In quel caso l'if non verrebbe eseguito...
aaa