IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Timer et fermeture de la fenêtre


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 284
    Par défaut Timer et fermeture de la fenêtre
    Bonjour,

    Je voudrais faire apparaitre une fenêtre en WPF puis fermer à la fois la fenêtre et l'application :
    - Soit au clic sur le bouton OK
    - Soit au bout de 3s

    J'ai donc fait ceci.
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public partial class UpdateInProgress : System.Windows.Window
    {
    	public static event EventHandler OnWindowDoClose;
    	private readonly Timer _TimerClose;
    	public UpdateInProgress()
    	{
    		InitializeComponent();
    		OnWindowDoClose += delegate { CloseAll(); };
     
    		_TimerClose = new Timer(3000);
    		_TimerClose.Elapsed += delegate
    		{
    			if (OnWindowDoClose != null)
    				OnWindowDoClose(this, null);
    		};
    		_TimerClose.Start();
     
    	}
     
    	private void BtCloseApp_Click(object sender, RoutedEventArgs e)
    	{
    		CloseAll();
    	}
     
    	private void CloseAll()
    	{
    		Close();
    		App.Close();
    	}
    }

    1) Si je clique sur le bouton => OK
    2) Si j'attends 3s => ERREUR

    J'obtiens dans CloseAll() lors de l'appel à Close();
    Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.
    Je pensais qu'en appelant CloseAll() au moment ou l'évènement est levé mais ça ne passe pas. Quelqu'un aurait il une idée svp?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    timer.Elapsed+=delegate{
    Dispatcher.BeginInvoke((Action)()=>CloseAll());
    };

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Oula, ça me semble bien compliqué comme approche
    Je ne vois vraiment pas l'utilité de l'évènement OnWindowDoClose, tu peux faire le CloseAll directement dans le Elapsed et ça reviendra au même.

    En fait, le problème est que tu utilises System.Timers.Timer, qui n'est pas spécialement étudié pour l'utilisation avec un interface graphique. L'évènement Elapsed est déclenché sur un nouveau thread, or les éléments graphiques ne peuvent être manipulés qu'à partir du thread de l'UI.

    Donc tu as 2 options :

    - utiliser Dispatcher.Invoke pour appeler CloseAll sur le thread de l'UI :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    _TimerClose.Elapsed += delegate{
        Dispatcher.Invoke(new Action(CloseAll));
    };
    - utiliser la classe DispatcherTimer au lieu de Timer. L'évènement Tick est déclenché sur le thread de l'UI, donc tu peux appeler CloseAll directement sans passer par Invoke

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fermeture de la fenêtre avec timer
    Par shayw dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/12/2014, 17h08
  2. Gestion d'un timer en dehors d'une fenêtre
    Par eag35 dans le forum MFC
    Réponses: 3
    Dernier message: 04/07/2005, 14h25
  3. Fermeture d'une fenêtre .dos
    Par VirginieGE dans le forum Windows
    Réponses: 2
    Dernier message: 03/06/2005, 13h56
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo