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

Windows Forms Discussion :

Problème de fonctionnement sous Vista.


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut Problème de fonctionnement sous Vista.
    Bonjour à tous.

    Je développe habituellement sur XP.
    Et j'ai essayé de voir ce que donnait l'une de mes applis sur Vista et là surprise y'a des trucs qui ne fonctionnent plus.

    Par exemple :

    Je charge dans un Panel Plusieurs PictureBox auxquelles j'affecte des images.
    Pour cela je créé le nombre de PictureBox nécessaire puis j'appelle un thread qui charge les images , sous XP pas de problème mes images apparaissent les unes après les autres alors que sur Vista nada.
    Et le problème c'est que depuis le thread je ne peut pas utiliser la fonction Refresh() de mes PictureBox.

    Donc la question est : quelqu'un a une idée? il y a t'il un procédé à effectuer pour être sûr qu'une appli developpée sous XP fonctionne sous Vista?

    Merci.

  2. #2
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Hello,

    en winforms, il ne faut pas modifier les contrôles dans d'autres thread que celui de la form.

    cf la MSDN : http://msdn.microsoft.com/fr-fr/libr...erequired.aspx
    Les contrôles dans les Windows Forms sont liés à un thread spécifique et ne sont pas thread-safe. Par conséquent, si vous appelez une méthode d'un contrôle à partir d'un autre thread, vous devez utiliser l'une des méthodes Invoke du contrôle pour marshaler l'appel au thread approprié. Cette propriété peut être utilisée pour déterminer si vous devez appeler une méthode Invoke, ce qui peut être utile si vous ne savez pas quel thread possède un contrôle.
    ಠ_ಠ

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Merci Guulh mais je savais ça, je l'ai d'ailleurs précisé.

    Mon interrogation se porte surtout "pourquoi sur XP et pas sur Vista?"
    J'ai testé sur différend poste et le seul paramètre que je vois c'est le changement d'OS.

    Une fois la thumbnail obtenu je place dans mon picturebox dons la propriété SizeMode vaut PictureBoxSizeMode.Zoom, sur XP les proportions sont respectées et pas sur Vista.

  4. #4
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Ah, je t'avais peut être mal compris quand tu disais "Et le problème c'est que depuis le thread je ne peut pas utiliser la fonction Refresh() de mes PictureBox.
    "

    Tu peux montrer le bout de code qui affecte l'image au picturebox ?

    Ce que je voulais dire, c'est que si on ne respecte pas les préconisations fournies dans la doc, on risque de rendre son appli dépendante de telle ou telle implémentation de la plate-forme. Là, peut être que Vista gère les threads différemment de XP, mais le framework ne te masque cette différence que si on code comme la doc l'indique. Mais cette remarque ne s'applique peut être pas à ton cas
    ಠ_ಠ

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Voila mon code.
    Il est vrai que c'est peut être ma méthode qui ne va pas.

    Donc avec ce code sous Vista :
    -problème de proportions.
    -l'affichage de l'image n'est pas réalisé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     private void affImage(PictureBox laPB, string fileWay)
    {
                FileThumbnail ft = new FileThumbnail(fileWay, 94, 94);
                laPB.Image =ft.Thumbnail;
    }

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Où sont le threads, dans ton code ? Dans le constructeur de FileThumbnail ? Ou bien la méthode affImage est lancée dans un autre thread ?

    As-tu le même problème si tu fais tout en synchrone ?
    ಠ_ಠ

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    [lu en diagonale]

    pour le pourquoi des différences, c'est que vista a une couche entre gdi+ et l'écran, tout le bureau étant géré par directX
    par contre en général ca n'apporte pas des problèmes, mais de la performance (les évènements paint étant déclenchés 2 à 3x moins souvent)


    [s'est décidé a jeter un oeil à la source que tu pointes]

    en fait vu le code, ma théorie précédente n'est pas en cause
    par contre d'un os à l'autre les dll ne sont pas toujours les meme ... donc utiliser du code qui ne fait qu'appeler des dll de l'os ...
    le but c'est à partir d'un dossier contenant des images d'avoir des miniatures ?
    parce que ca peut s'écrire en .net (après faudrait voir si niveau performance c'est aussi bien que des appels de dll)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Voici le fonction appelé pour le thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void Th1()
    {
           foreach (listItem monLI in mesListItem)
           {
                  try
                  {
                        affImage(monLI.laPictureBox, monLI.leFichierImage.FullName);
                  }
                  catch { }
           }
    }
    Je l'appel dans mon code comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    t1 = new Thread(new ThreadStart(Th1));
    t1.Start();

    @Pol63 : Le but est de récupérer les miniatures des fichiers quel qu'ils soient, et ce code est le seul que j'ai trouvé qui y arrive bien.

    De ce côté je n'ai pas trop de problème.
    Sous Vista aussi on récupère la miniature, mais elle est déformée une fois rentrée dans la picturebox (comme son on utilisait Stretch au lieu de Zoom)

    Et le second problème c'est que sous XP que je rentre ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    laPB.Image =ft.Thumbnail;
    L'image apparait directement dans la picturebox alors que sous Vista ça en se produit pas.

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je suis sous vista, je viens d'essayer le code de ton site, et j'ai un message d'erreur
    impossible de trouver le point d'entrée 155 dans la dll shell32.dll
    ce qui rejoindrait ce que je disait plus haut, utiliser des dll de windows et vouloir que son appli marche sur tous les windows sont 2 choses qui ne font pas forcément ensemble ...

    cherche d'autres sources, apparemment il y aurait d'autres méthodes
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    je suis sous vista, je viens d'essayer le code de ton site, et j'ai un message d'erreur "impossible de trouver le point d'entrée 155 dans la dll shell32.dll"

    ce qui rejoindrait ce que je disait plus haut, utiliser des dll de windows et vouloir que son appli marche sur tous les windows sont 2 choses qui ne font pas forcément ensemble ...

    cherche d'autres sources, apparemment il y aurait d'autres méthodes

    Ok merci!
    Je cherche, je cherche...mais je trouve pas grand chose.

    Mais ce qui est étrange c'est que sur mon vista ceci marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FileThumbnail ft = new FileThumbnail(fileWay, 94, 94);
    laPB.Image =ft.Thumbnail;
    Mais pas tout le temps.
    A la vérification j'ai la même chose dans l'image mais lors du thread ça ne place pas l'image.
    Alors que si j'effectue la méthode affImage dans la form cela fonctionne.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    fait voir ta gestion de délégué pour revenir sur le thread principal
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public delegate void imageChargeHandler(object sender, imgChargeEventArgs imgC);
    public event imageChargeHandler ImageCharge;

    Classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class imgChargeEventArgs : EventArgs
    {
        public PictureBox PB;
        public imgChargeEventArgs(PictureBox _PB) { PB = _PB; }
    }

    Abonnement dans le thread principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImageCharge += new imageChargeHandler(Visionneuse_ImageCharge);
    Appel dans le thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void Th1()
    {
                    foreach (listItem monLI in maListItem)
                    {
                        try
                        {
                            imgChargeEventArgs e = new imgChargeEventArgs(monLI.laPictureBox);
                            if (ImageCharge != null) ImageCharge(this, e);
                        }
                        catch (Exception ee) { MessageBox.Show(ee.Message); }
                    }
    }
    Fonction effectuée lors de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Visionneuse_ImageCharge(object sender, imgChargeEventArgs imgC)
            {
                foreach (listItem monLI in maListItem)
                {
                    if (imgC.PB == monLI.laPictureBox)
                    {
                        affImage(monLI.laPictureBox, monLI.leFichier.FullName);
                    }
                }
            }
    A noté que la boucle placer ailleurs dans le thread principal fonctionne bien.
    J'ai surtout utilisé cette méthode comme teste.

    J'ai aussi remarqué qu'une fois fini le thread, les picturebox on bien l'image en propriété mais qu'un refresh n'affiche pas ces images.
    Il faut rappeler la fonction affImage, qui au final refait le thumbnail et repasse le thumbnail à la propriété Image du PictureBox qui l'avait déjà mais qui cette fois l'affiche.

  13. #13
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Attention, j'ai l'impression que tu confonds events et threads

    Là, la méthode exécutée dans ton thread déclenche l'événement ImageCharge. Mais la méthode abonnée à cette event, Visionneuse_ImageCharge, sera exécutée dans le même thread.

    Les events C# sont complètement synchrones.

    Ce que tu veux, ici, c'est que ton thread métier refile un objet à ton thread graphique. et ça, ça se fait en appelant la méthode Invoke de la form (ou d'un contrôle), comme indiqué dans le lien ci-dessus-dessus.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void SetPictureBoxImage(PictureBox pb, Image im)
    {
    	if (!this.InvokeRequired)
    		pb.Image = im;
    	else
    		this.Invoke(new MethodInvoker(delegate() { pb.Image = im; }));
    }
    ಠ_ಠ

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    ça ne marche encore que sous XP, sous Vista j'ai le même résultat en faisant :

    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
     
    private void Th1()
    {
                    foreach (listItem monLI in maListItem)
                    {
                        try
                        {
                            affImage(monLI.laPictureBox, monLI.leFichierImage.FullName);
                        }
                        catch{}
                    }
    }
     
    private void affImage(PictureBox laPB, string fileWay)
    {
           FileThumbnail ft = new FileThumbnail(fileWay, 94, 94);
           //laPB.Image = ft.Thumbnail;
           SetPictureBoxImage(laPB, ft.Thumbnail);
    }

    ça ne m'affiche pas les images!

  15. #15
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Il ne te reste qu'à décomposer ton code pour voir, dans tout ton process, quelle est l'étape qui foire. ca peut être le threading, ou bien une des méthodes Win32 utilisées par ta classe Thumbnail...
    ಠ_ಠ

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Je viens de faire un test.

    Comme je voulais des miniatures de n'importe quel fichier j'utilisais en test un dossier avec des fichiers coreldraw .cdr .

    ça m'a induit en erreur visiblement car pour un fichier jpg cela marche très bien.
    Je ne parle pas que de l'Invok mais aussi mon code de départ.
    Les jpg s'affichent tout de suite sans problème....enfin sans problème, si, il y a toujours le problème de proportions non respectées.

Discussions similaires

  1. Problème avec Shellexecute sous Vista
    Par scara dans le forum Langage
    Réponses: 2
    Dernier message: 19/11/2007, 18h09
  2. [D6/XP] Problème de curseur sous Vista
    Par banban54 dans le forum EDI
    Réponses: 1
    Dernier message: 28/09/2007, 20h55
  3. problème de défragmentation sous Vista Ultimate
    Par !Jokeman! dans le forum Windows Vista
    Réponses: 5
    Dernier message: 02/06/2007, 17h51
  4. problème de connexion sous Vista
    Par nasser.h dans le forum Windows Vista
    Réponses: 1
    Dernier message: 16/02/2007, 08h44
  5. Réponses: 1
    Dernier message: 03/01/2007, 14h20

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