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 :

[3.5] problème pour redémarrer une application


Sujet :

C#

  1. #1
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut [3.5] problème pour redémarrer une application
    salut tout le monde,

    je bosse sur une appli c#, composée d'une interface WPF et d'un thread d'accès aux données en parallèle.
    J'utilise le deployement ClickOnce, et pour éviter de faire intervenir le client quand je publie des mises à jour, j'ai inséré dans mon code la détection et le téléchargement de ces MAJ. Je termine par un Application.Restart() quand tout est prêt.
    ce bout de code est dans le thread de l'accès aux données.

    Le problème, c'est que la méthode lance une nouvelle instance de l'application sans fermer l'ancienne, au bout de 2 jours elle tournait 6 fois (autant que de mise à jour)...

    Quelqu'un aurait-il une solution?

    merci d'avance!

  2. #2
    Membre extrêmement actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Points : 1 173
    Points
    1 173
    Par défaut
    un Application.Exit() avant ou après le restart ne résoud rien?

  3. #3
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Non, je vient de redémarrer le PC car l'application tournait 40 fois en même temps! et même si ça aurait marché je trouve ça très surprenant de devoir en arriver la...
    cette méthode Restart() est louche...

  4. #4
    Membre extrêmement actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Points : 1 173
    Points
    1 173
    Par défaut
    Citation Envoyé par thelpi Voir le message
    Non, je vient de redémarrer le PC car l'application tournait 40 fois....
    Essaie quand même ce que je t'ai proposé

    Citation Envoyé par thelpi Voir le message
    ...et même si ça aurait marché je trouve ça très surprenant de devoir en arriver la...
    cette méthode Restart() est louche...
    Effectivement puisque Restart arrête l'application et démarre immédiatement une nouvelle instance. Peut être fais-tu une autre manip'

  5. #5
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Et pourquoi tu ne ferais pas une autre application qui serait appelée par la première pour télécharger les données ?

    Je m'explique disons toto.exe ton application à mettre a jour tu code une autre application updater.exe quand toto.exe détecte une maj elle appelle updater.exe et se suicide via une Kill() updater fait les mises à jour et relance toto.exe

  6. #6
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Quand tu arrêtes ton application principale, tu n'oublies pas d'arrêter tes threads proprement ?

  7. #7
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Fally => je me suis mal exprimé, quand je dit que j'ai du redémarrer mon PC, c'était en utilisant ta méthode!

    teddyalbina => ce sera la dernière solution à envisager, je trouve ça bien compliqué, alors que je suis sur que le problème ne doit pas être grand chose

    Jérôme Lambert => effectivement, je pense plutot que le probleme vient de la. Comme je l'ai dit dans mon premier post, je redémarre l'application à partir du thread en parallèle à l'interface graphique.

    En fait, dans le Main() de l'application, je charge tout mes composants graphiques, et une fois terminés je lance le deuxième thread, mais bien sur le thread principal est toujours Alive.

    Comme je suis obligé de faire la détection de MAJ dans le deuxième thread, j'ai essayé ensuite de la manière suivante:

    dans le 2ème thread, au lieu de faire Application.Restart quand les MAJ sont prètes, je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.CurrentThread.Abort();
    dans le thread principal, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Thread2.Run(); // lancement du deuxième thread
    while (Thread2.IsAlive) {} // ne fait rien
    Application.Restart() // quand le thread 2 est arrété, redémarrage
    cette méthode ne marche pas non plus, mais effectivement comme je ne m'y connait pas trop en Thread, je ne suis pas sur que tout ceci soit bien clean de toute façon...

    Merci pour vos réponses!

  8. #8
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut
    Et as tu essayé Environment.Exit() ?

  9. #9
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    la méthode d'Onlava à l'air de marcher, même si je n'aime pas trop mettre du code auquel je ne comprend pas grand chose (cf. le "exitcode" à mettre en argument notamment)...

    Malgré tout, si quelqu'un à déja eu des problèmes avec Application.Restart() je préférerais avoir une explication (c'est pourquoi je ne met pas le tag résolu)

    merci en tout cas.

  10. #10
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut
    ExitCode, tu mets ce que tu veux.
    Il me semble que par convention windows, un code différent de zéro signifie que l'application ne s'est pas terminée correctement. On peut y passer un code d'erreur par ex.

    a+

  11. #11
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    j'ai mis justement 0, je ne sais pas l'impact que ça va avoir
    j'aurais un retour ce soir de la part du client pour savoir si l'appli c'est bien fermé avant de rebooter, mais même si ça marche j'aurais préféré une solution plus "maitrisé" pasque la c'est vraiment la loterie...

  12. #12
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Si tu configures les threads que tu crées dans ton application pour que ce soit des threads d'arrière plan (background thread), tu as toujours le problème ?

    Par défaut ce n'est pas le cas il me semble (on parle de foreground thread à ce moment), il faut l'indiquer de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monThread.IsBackground = true;
    Cela permettra de voir si déjà le Application.Restart seul suffit (les background threads ne pouvant pas bloquer la fin d'un process, contrairement aux foreground threads), car cela devrait être le cas si tous tes threads sont configurés ainsi.

    Si à partir de là le Restart fonctionne bien, soit tu peux faire avec des background threads (ils sont donc forcés à stopper, ce qui peux être gênant) soit tu dois forcer toi même l'interruption de tes threads proprement pour que le process puisse être quitté.

  13. #13
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Je ne crée qu'un seul Thread supplémentaire au programme principal. Ce thread est effectivement background.

    De toute façon, je n'ai que 2 possibilités vu l'architecture de l'appli: c'est le thread en background qui détecte la mise à jour, à partir de la soit c'est lui qui appelle le Application.Restart() [ça ça ne marche pas], soit je stoppe le thread immédiatement pour redémarrer à partir du programme principal (voir mon 3ème post du topic) [ça ne marche pas non plus].

    En aucun cas je ne peux laisser le thread de background continuer de tourner après la détection de la mise à jour, donc le booléen "est background"/"ne l'est pas" ne change rien dans mon cas (si j'ai bien compris )

  14. #14
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    La propriété IsBackground permet, si on la met à true, d'indiquer que le thread ne doit pas bloquer la fermeture du process (de l'application donc). Par défaut un thread est foreground (IsBackground = false donc) ce qui veut dire que le process ne peut se terminer tant que le thread continu à vivre.

    Donc si ton thread n'est pas un thread background (IsBackground = true), et c'est le cas je pense, c'est la raison des instances multiples de ton application. C'est la seule raison qui puisse expliquer ce comportement d'ailleurs.

    Par exemple
    Code : 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
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
     
        private void Form1_Load(object sender, EventArgs e)
        {
            ThreadStart ts = new ThreadStart(Test);
            Thread thread = new Thread(ts);
            thread.Start();
        }
     
        private void Test()
        {
            while (true)
            {
                Thread.Sleep(100);
            }
        }
     
        private void button1_Click(object sender, EventArgs e)
        {
            Application.Restart();
        }
    }
    Avec ce code j'aurai plusieurs instances de mon application à chaque Restart car le thread est foreground et il empêche donc la fin du process (on a l'impression d'avoir quitté l'application mais en fait non, le process est toujours présent si on regarde la liste des process Windows dans le gestionnaire de tâches).

    Si avant le thread.Start() j'ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    thread.IsBackground = true;
    La fermeture du process n'est plus bloquée par le thread et j'aurai une instance de mon application à chaque Restart.

  15. #15
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Sauf qu'avec ton code, si j'ai pigé, le problème est que la windows form redémarre comme souhaité mais le Thread parallèle n'est pas stoppé et sera lancé une deuxième fois, c'est ça?

    Or, mon problème est un peu différent: mon Application.restart(), qu'il soit dans le thread ou dans le code la Windows Forms (enfin c'est du wpf mais ça doit pas changer grand chose), ne redémarre.. rien du tout! résultat: un grand nombre de fenêtres qui s'accumulent, chacune relançant le thread background

  16. #16
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ne faisant pas de WPF, aucune idée si le comportement peut être différent, même si j'en doute.

    Tu as essayé avec IsBackground à true ou pas sinon ? Histoire de voir ce qu'il se passe quand même. C'est la seule raison que je vois en tout cas.

  17. #17
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    Je vient d'essayer ces 2 choses:

    première méthode

    code du programme principal WPF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    monThread.isBackground = true;
    monThread.Start();
    code du thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (mise à jour prête)
    {
               Application.Restart();
    }
    deuxième méthode

    code du programme principal WPF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    monThread.isBackground = true;
    monThread.Start();
    while (monThread.isAlive) {}
    Application.Restart();
    code du thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (mise jour prête)
    {
               Thread.CurrentThread.Abort();
    }
    les 2 m'affichent rapidement un grand nombres de fenètres en exécution...

Discussions similaires

  1. [WEB] Problème pour lancer une application web
    Par verbose dans le forum Eclipse
    Réponses: 0
    Dernier message: 28/09/2009, 13h08
  2. Problème pour déployer une application au sein de Tomcat.
    Par mhamdi200 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 07/04/2008, 14h17
  3. Réponses: 2
    Dernier message: 14/12/2007, 11h43
  4. Réponses: 4
    Dernier message: 09/05/2007, 18h03
  5. Réponses: 5
    Dernier message: 24/09/2005, 21h31

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