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

VB.NET Discussion :

Utiliser les threads et picturebox


Sujet :

VB.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Par défaut Utiliser les threads et picturebox
    Bonjour,

    J'essaye de rafraichir une gif sur une form, pendant un traitement assez lourd.
    Pas de soucis je créé un thread différent, dans lequel je vais lancer l'affichage de mon gif.
    Problème, c'est qu'il me sort cette erreur
    Le contrôle 'PictureBox26' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    J'ai lu des choses sur invoke etc... Mais j'ai l'impression d'être un gamin de 8ans, j'arrive pas à comprendre.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
            Cursor.Current = Cursors.WaitCursor
            test_fin_process = 0
            BackgroundWorker.RunWorkerAsync()
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub BackgroundWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
            While test_fin_process = 0
               PictureBox26.Show()
                System.Windows.Forms.Application.DoEvents()
            End While
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub BackgroundWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker.RunWorkerCompleted
            PictureBox26.Hide()
            System.Windows.Forms.Application.DoEvents()
        End Sub
    Si vous pouvez m'aiguiller... Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 117
    Par défaut
    bonjour,

    j'ai été confronté au même type de problème : il n'est pas possible de toucher aux éléments de l'interface graphique à partir d'un nouveau thread (pour autant que je sache).

    ce que je te conseille de faire c'est de placer l'instruction PictureBox26.Show() dans la Sub Button10_Click
    A priori il ne doit pas être gênant de laisser PictureBox26.Hide() dans BackgroundWorker_RunWorkerCompleted
    (je ne peux pas tester en ce moment)

    par ailleurs, je ne pense pas que le DoEvents soit indispensable (à vérifier)

  3. #3
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Salut,

    Ca serait peut-être mieux de mettre PictureBox26.Show() en dehors du DoWork.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
            Cursor.Current = Cursors.WaitCursor
            test_fin_process = 0
            PictureBox26.Show()
            BackgroundWorker.RunWorkerAsync()
    ...
    Autrement System.Windows.Forms.Application.DoEvents() est inutile ici.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2010
    Messages : 62
    Par défaut
    Bonjour,

    Il n'est pas possible de modifier un élément d'un thread depuis un autre.
    Pour la méthode invoke que vous énoncez :
    Si vous avez un thread A et un thread B, B peut demander à A de faire une action via la méthode invoke (version light, plein de tuto explique le fonctionnement des threads, delegate, etc..).
    Donc pour faire simple, si votre thread A qui gère l'affichage exécute un traitement lourd, le fait de créer un thread B qui va uniquement faire une demande d'affichage au thread A (qui du coup va le mettre dans sa file d'attente) sera équivalent à mettre la demande directement dans le thread A.

    Une solution dans votre cas, serait plutôt de créer un thread B qui va s'occuper du traitement lourd dont vous parlez et de laisser l'affichage de votre image dans le thread A.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 11
    Par défaut
    Ok merci je vais voir ca

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

Discussions similaires

  1. comment utiliser Les threads
    Par alaa_85 dans le forum VB.NET
    Réponses: 33
    Dernier message: 08/06/2007, 13h53
  2. Utiliser les threads pour les traitements long
    Par rach375 dans le forum Websphere
    Réponses: 3
    Dernier message: 14/11/2006, 12h08
  3. Utiliser les threads dans application Struts
    Par rach375 dans le forum Struts 1
    Réponses: 7
    Dernier message: 18/09/2006, 11h32
  4. Comment utiliser les Threads en VC++?
    Par mambo dans le forum MFC
    Réponses: 2
    Dernier message: 16/06/2006, 14h04
  5. BeginInvoke (utiliser les threads)
    Par the big ben 5 dans le forum Delphi
    Réponses: 6
    Dernier message: 16/05/2006, 18h30

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