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 :

PB Multithread sous XP (mais pas sous vista)


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut PB Multithread sous XP (mais pas sous vista)
    Bonjour a tous !

    voila j'ai un soucis
    j'ai crée une application qui change la config réseau d'un poste.
    j'ai ma thread principale qui est sensée m'afficher l'état de ma config, et mon backgrounWorker qui lui est sensé paramétrer mon poste !

    donc en gros j'ai une form "Attente" avec un message qui change selon l'etat.
    pour cela j'ai créer un tableau d'autoevenReset comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            chgconfig = new AutoResetEvent[]
            {
                new AutoResetEvent(false),
                new AutoResetEvent(false),
                new AutoResetEvent(false)
            };
    puis j'ai dans mon main des wait qui me permette de changer le mess selon les renvois de mon backgrnd :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    windows.message.Text = "Configuration de votre adresse ip en cours...Merci de patienter";
                    chgtconfig.WaitOne();
                    windows.message.Text = "Configuration de vos DNS en cours...Merci de patienter";
                    chgtconfig.WaitOne();
                    windows.message.Text = "Configuration de vos lecteurs réseaux...Merci de patienter.";
                    chgtconfig.WaitOne();
                    windows.message.Text = "Ajout de vos lecteurs réseau...Merci de patienter.";
                    chgtconfig.WaitOne();
    Voila mon background renvoi lui a la fin de chacun des processus de config un : chgconfig[0].Set() , puis chgconfig[1].Set()
    ce qui a pour but de relancer la main thread et donc de changer le mess jusqu'au prochain .Set

    Mon problème c'est que sous Windows Vista avec visual Studio 2005 ca marche niquel , c'est à a dire que mon messsage change bien en fonction de mon backgroundWorker mais que dès que je le compile et que je le test sous XP alors la ma form Attente reste figé ! mais ma configuration de poste se passe bien !

    Je précise que j'ai mis a jour les frameworks d'xp mais sans succès...
    si qqun a une idée du pourquoi du comment je suis preneur ! merci d'avance !

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Cela me parait normal.
    En fait sous XP lorsque tu fais un wait dans ta form par exemple, ta form freaze

    Pas de rafraichissement de celle-ci.

    Là cela semble être ton cas :
    - Affichiche un etat -> normal.
    - Un fraction de seconde après en état d'attente -> freaze.
    - On recommence le cycle.

    Vista gère certainement mieux l'affichage dans ce genre de cas. Plutot qu'une fenêtre qui semble bugué, il doit maintenir la fenêtre tel qu'elle étati avant le freaze.


    Pour en partie résoudre ton problème, je te conseille d'utiliser le state design pattern, il semble adapté à ton cas.
    Patron de conception etat.
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    Il se peut qu'il y est un pb de rafraichissement, le thread du background tournant sans cesse, le system n'éli pas le thread principal tant que le thread du background n'a pas terminer. Je te conseille de mettre un Thread.Sleep(0); après chaque étape du background. Ca suffit souvent pour débloqué le truc.

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    ok j'essaierai avec le thread.sleep sur le background...
    je le place juste apres le .set si j'ai bien compris ?

    le state pattern in english j'attendrais demain pour le décrypter mais merci quand meme

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Euh pour moi c'est idiot d'utiliser un backgroundworker si c'est pour le synchroniser avec le thread principal... C'est vraiment se tirer une balle dans le pied.
    Utilise l'événement ProgressChanged du backgroundworker. Dans le DoWork, intercalés entre tes actions, tu ajoutes des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ReportProgress(0, "Configuration de votre adresse ip en cours...Merci de patienter");
    ...
    ReportProgress(25, "Configuration de vos DNS en cours...Merci de patienter");
    ...
    ReportProgress(50, "Configuration de vos lecteurs réseaux...Merci de patienter.");
    Et dans l'eventhandler monBackgroundworker_ProgressChanged, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    windows.message.Text = Convert.ToString(e.UserState);
    monProgressBar.Value = e.ProgressPercentage;
    De cette manière, c'est propre, et ça ne freeze pas.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    aucune idée concernant le freeze (Vista devrait freezez aussi ... ), mais au lieu de s'embeter avec des events de threading, c'est pas mieux de faire des evenements (genre DNSLoaded, NetworkDriveLoaded etc ...). Ca eviterai de jouer avec des WaitOne sur du thread graphic (caypabien !).

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    le state pattern in english j'attendrais demain pour le décrypter mais merci quand meme
    Novicité dasn l'utilisation de wikipédia ?
    En bas à gauche de la fenêtre, tu as la liste des langues dans lequelles la page a été traduite.
    Hé il y a Français

    Bon c'esty moin complet je l'avoue, mais tu récupères 4 mot dont 3 essentiels :
    Patron de conception etat.

    Avec google et ces 4 mots tu obtiens des liens expliquant ce patron de conception, et en français !!!

    Et je pense qu'il pourrait t'intéresser !!!
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    HUHUUUU comme je me suis fait gronder !!

    Bon bah merci quand même, j'avoue avoir chercher comment utiliser le background mais je n'ai pas réussi a trouver d'explication assez convaincante pour me faire passer à la progress bar...alors j'ai recherché un moyen de communiquer entre 2 thread et Krosoft m'a répondu : LE WAITONE

    Je vais m'empresser d'essayer ta méthode et d'effacer ma grossière erreur ! je vous tiendrais au courant! merci n'a vous
    en tout cas promis sous vista avec les wait ca freeze pas !


    CED => Novicité comme t'as pas idée ! merkiiii de l'info (j'aime me ridiculiser en trois posts....)

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    HUHUUUU comme je me suis fait gronder !!
    On ne te gronde pas, on te conseil.
    Lorsque l'on gronde, même le tonnerre nous fuis car il a peur !!!!
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    Lol ha ouais quand même ! ha bah ca va j'assimile vos critiques a des caresses ca va... hum ok jpars en ***.

    en tout cas vu ton avatar ced on se dit.... hihi...
    Aller y en a qui bosse ! jvais tester ce ptit code et je re éditer ma counasserie de post !

  12. #12
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Tu as raison, faut que j'aille bosser pour mettre en application l'image de mon avatar
    Pourquoi faire compliqué lorsque l'on peut faire encore plus compliqué.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 30
    Points : 16
    Points
    16
    Par défaut
    VOILAAAA !! (non je n'ai pas fait que ca sinon j'avoue que j'aurais été bien lent ! lol)
    mais ca marche impeccable et j'avoue que passer par une gestion d'evenements est tout de même beaucoup plus propre !
    Un grand merci a tous pour votre aide car j'ai enfin fini mon programme !
    @ Très vite

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

Discussions similaires

  1. [MS DOS] Taskkill echoue sous XP mais pas sous vista
    Par Arnard dans le forum Windows XP
    Réponses: 1
    Dernier message: 15/09/2009, 10h39
  2. Script ok sous XP mais pas sous Vista
    Par jfox dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/04/2009, 23h19
  3. [XML] Shift-JIS : Marche sous Firefox mais pas sous IE...
    Par Magus (Dave) dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 24/01/2006, 17h19
  4. Jascript fonction sous IE mais pas sous Netscape ou FF
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 29/12/2005, 17h02
  5. Menu dynamique marchant sous FF mais pas sous IE
    Par T-durden dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 18/08/2005, 14h14

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