Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - C# Evento timing in notifyicon
Forum - C# / VB.NET - C# Evento timing in notifyicon

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
danielerew (Normal User)
Newbie


Messaggi: 15
Iscritto: 10/06/2011

Segnala al moderatore
Postato alle 6:04
Lunedì, 18/07/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
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:49
Lunedì, 18/07/2011
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?

PM Quote
Avatar
danielerew (Normal User)
Newbie


Messaggi: 15
Iscritto: 10/06/2011

Segnala al moderatore
Postato alle 2:28
Martedì, 19/07/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
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:22
Martedì, 19/07/2011
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

  1. ticker.Tick -= OnTimedEvent;


PM Quote
Avatar
danielerew (Normal User)
Newbie


Messaggi: 15
Iscritto: 10/06/2011

Segnala al moderatore
Postato alle 19:48
Martedì, 19/07/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

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 12:16
Mercoledì, 20/07/2011
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

  1. private void Restore()
  2.         {
  3.             notifyIcon1.Visible = false;
  4.             MainWindow main;
  5.             main = new MainWindow();
  6.             main.Show();
  7.             //main.WindowState = WindowState.Normal;
  8.         }



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.

PM Quote
Avatar
danielerew (Normal User)
Newbie


Messaggi: 15
Iscritto: 10/06/2011

Segnala al moderatore
Postato alle 18:15
Mercoledì, 20/07/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
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:16
Giovedì, 21/07/2011
Magari WindowState non è Minimized, anche se può sembrare strano. In quel caso l'if non verrebbe eseguito...

PM Quote
Avatar
danielerew (Normal User)
Newbie


Messaggi: 15
Iscritto: 10/06/2011

Segnala al moderatore
Postato alle 13:18
Giovedì, 21/07/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
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo