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 :

Créer Handle de fenetre


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    915
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 915
    Par défaut Créer Handle de fenetre
    Bonjour,
    J'ai un message d'erreur quand j'utilise cette procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Sub Methode2()
        Dim main As Form5 = CType(Application.OpenForms("Form5"), Form5)
        For x As Integer = 0 To 10
            main.Invoke(New MethodInvoker(Sub() Label8.Text = x))
            Label8.Text = x
            Thread.Sleep(1000)
        Next
    End Sub
    déclenchée par un click sur un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub VID49_2_Form5_Click(sender As Object, e As EventArgs) Handles VID49_2.Click, VID49_2_Form5.Click
     
        Dim thread1 As New Thread(Sub() Methode2())
        thread1.IsBackground = True
        thread1.Start()
    End Sub
    L'erreur est : "System.InvalidOperationException*: 'Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas été créé.'"

    A noter que j'ai rajouté la déclaration dans ma Methode2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim main As Form5 = CType(Application.OpenForms("Form5"), Form5)
    et que le problème ne survient quand j'arrete le processus(avant que x vaille 10) quand je ferme la fenetre

    Si quelqu'un a une idée MERCI

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 736
    Par défaut
    Bonjour,

    Alors là franchement, je me demande ce que tu veux faire.
    OpenForms va te renvoyer une collection de form ouverts (de nom "Form5").
    Et toi tu essaies de changer le type de la collection en form
    En général l'utilisation d'OpenForms va de pair avec un For Each...
    Après tu appelles dans la fameuse form Main dont on ne sait pas ce qu'elle contient vraiment, un sub qui met une valeur dans un label et tu utilises invoke pour çà (avec New methodInvoker en plus...) juste pour modifier un label, alors que la ligne suivante, tu modifies ce même label par une simple instruction (Methode2 se trouve où ? dans ton formulaire Form5, ailleurs ?)


    Par ailleurs, le message d'erreur est sur quelle instruction ?
    Si c'est sur la ligne invoke c'est clair, ton formulaire main ne pointe sur rien. Ce qui ne m'étonne pas, vu la 1ère remarque que j'ai faite.
    Si c'est sur la ligne où le label est modifié directement, c'est peut-être (mais il nous manque trop d'éléments), que ce label8 n'est pas accessible par Methode2 (autre formulaire, ou plutôt formulaire non ouvert).

    Il y a des règles de base à suivre, et l'une des premières et de n'utiliser un objet que si on est certain qu'il est utilisable.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    915
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 915
    Par défaut
    Merci pour ta réponse, c'est pour illustrer un tuto vu sur YTube, j'ai réglé le problème comme ceci(en "zappant" l'erreur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub Methode2()
        For x As Integer = 0 To 10
            Try
                Invoke(New MethodInvoker(Sub() Label8.Text = x))
            Catch ex As Exception
     
            End Try
            Label8.Text = x
            Thread.Sleep(1000)
        Next
    End Sub
    En effet c'est le fait de fermer la fenêtre qui me provoquait l'erreur, du coup plus de problème peut être que tu as une meilleure et/ou plus "propre" solution ?

  4. #4
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 736
    Par défaut
    Je pense qu'il y a toujours plusieurs soucis.
    Et tout ce qu'il y a depuis Try jusqu'à End Try semble inutile, ici.
    Si çà ne plante plus, c'est que la modification du label en direct (la ligne 9 dans ton dernier post) fonctionne. Donc que ton sub Methode2 est dans le formulaire où figure ce fameux label8. Et donc que ce qui précède est inutile.
    En revanche, si Methode2 était dans un module séparé ou un autre formulaire, c'est cette ligne qui planterait, et là il faudrait que tu fasses référence à ton formulaire.
    Bref, il y a beaucoup de travail encore pour que ce tuto soit vraiment utile.

    D'ailleurs, ces noms de sub, de label, de formulaire, sont tous sauf expressifs !
    Une autre règle de base, nommer de manière à parfaitement identifier, et de manière unique, tous les éléments.
    Form5 pourrait s'appeler Form_ThreadDemo par exemple.

    Maintenant, tu n'as toujours pas expliqué ce que tu voulais faire exactement avec ton code. Peut-être qu'on pourrait mieux t'orienter si on avait tous les éléments.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    915
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 915
    Par défaut
    Citation Envoyé par m4k-Hurrican Voir le message
    Je pense qu'il y a toujours plusieurs soucis.
    Et tout ce qu'il y a depuis Try jusqu'à End Try semble inutile, ici.
    Si çà ne plante plus, c'est que la modification du label en direct (la ligne 9 dans ton dernier post) fonctionne. Donc que ton sub Methode2 est dans le formulaire où figure ce fameux label8. Et donc que ce qui précède est inutile.

    Maintenant, tu n'as toujours pas expliqué ce que tu voulais faire exactement avec ton code. Peut-être qu'on pourrait mieux t'orienter si on avait tous les éléments.
    bjr, merci pour le suivi, oui Methode2 fait parti du formulaire si j'enlève le try :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub Methode2()
        For x As Integer = 0 To 10
          Label8.Text = x
          Thread.Sleep(1000)
        Next
    End Sub
    j'ai cette exception à l'exécution :

    System.InvalidOperationException*: 'Opération inter-threads non valide*: le contrôle 'Label8' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.'

    Si je remets "invoke" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub Methode2()
        For x As Integer = 0 To 10
     
            Invoke(New MethodInvoker(Sub() Label8.Text = x))
     
     
     
            Label8.Text = x
            Thread.Sleep(1000)
        Next
    End Sub
    Si j'arrete le processus (fermeture de la fenêtre ) avant la fin de la bouche tant que x < 10 j'ai cette exception, si je vais au bout de la procedure x=10 je ne l'ai pas :

    "System.InvalidOperationException*: 'Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas été créé.'"

    Le programme "va" sur le try en erreur mais comme j'ai rien mis ne fais rien quand je ferme la fenêtre.

    Ce petit code c'est simplement pour moi pour comprendre les threads

    Merci

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 578
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 578
    Par défaut
    Tu ne penses pas qu'il serait plus logique de sortir de la boucle si le label (et donc sa fenêtre) ne sont plus existants? ou de ne pas chercher à l'invoquer si non existant ?

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

Discussions similaires

  1. Handle de fenêtre non valide
    Par bernie.noel dans le forum Langage
    Réponses: 5
    Dernier message: 18/03/2008, 18h48
  2. [VB.Net] "Impossible de créer le handle de fenêtre"
    Par cedric_g dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/04/2006, 12h49
  3. Réponses: 10
    Dernier message: 13/05/2005, 12h08
  4. comment changer le handle de fenêtre
    Par latisane dans le forum MFC
    Réponses: 21
    Dernier message: 20/01/2005, 18h42
  5. [Window] Handle de fenêtre
    Par el_diablos dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 01/07/2004, 14h12

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