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 :

[VB.NET2005] Threads et chargement de winforms ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut [VB.NET2005] Threads et chargement de winforms ?
    Bonjour,

    J'ai lu quelquepart sur le net qu'il était possible de charger toute une form pendant l'ecran splash au demarrage de l'applicatif pour que son chargement soit immediat, plutot que de mettre toutes ses etapes de construction dans le form.loading().

    Cependant je ne comprends pas trop le principe, que je n'arrive pas à adapter à mon cas de figure :

    1) J'ai une form splash sur laquelle j'ai créé un backgroundworker
    2) J'effectue dans mon backgroundworker toutes les operations de chargements de tables access dans mon dataset, les calculs sur mes données

    Par contre quand je lui donne des actions à effectuer sur ma mainform, genre formatage de tableau...et tout et tout, la il me crache une erreur de thread croisé...ce qui somme toute est assez logique


    Donc comment faire pour précharger une fenêtre avant son ouverture ??

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Appelle la fonction qui charge les données avec Invoke, ça devrait résoudre le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    form.Invoke(delegate() { form.LoadData(); });
    (désolé, c'est du C#, je sais pas comment on fait un delgate anonyme en VB.NET...)

  3. #3
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut
    Oui c'est effectivement ce que j ai pu voir sur le net : utiliser la fonction delegate....

    Mais je ne saisis vraiment pas bien son fonctionnement, quelqu'un pourrait me donner un exemple... ??

    Que faut il passer en argument ???

    Comment l appeler et ou ??

    Merci

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En fait delegate n'est pas une fonction, c'est un mot clé du langage C#. Mais je sais pas trop si on peut l'utiliser de cette façon en VB. Sinon tu peux faire comme ça :
    1. Déclare un delegate qui a la même signature que ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public Delegate Sub MyDelegate()
    2. Appelle Invoke en passant en paramètre le delegate qui pointe sur ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    form.Invoke(New MyDelegate(AddressOf form.LoadData))
    Si ta fonction a des paramètres, c'est presque pareil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public Delegate Sub MyDelegate(titi As Integer, toto As String)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    form.Invoke(New MyDelegate(AddressOf form.LoadData), 1234, "hello world")

  5. #5
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Par défaut
    Bon ca ne marche pas, alors j'expose mon pb plus precisement au cas ou j'aurais saute une etape :

    J'ai 2 forms :

    - Une form splash

    -Une form Main que je dois charger apres la splash

    Dans l'evenement mybase.load de ma mainform j'appelle des fonctions de formattage de datagridview, de coloration de cellules, d'attribution de datasource a des combobox...etc etc

    J'ai regroupé ces fonctions d'initialisation de la mainform dans une autre fonction que j'ai déclaré dans ma mainform comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Sub MainFormDataLoad()

    Dans ma fenetre splash j'ai déclaré mon delegate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Delegate Sub Mainform_Delegate()
    que j'appelle avant de femer ma fenetre splash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MainForm.Invoke(New Mainform_Delegate(AddressOf MainForm.FormDataLoad))
    Et la boum badaboum : une belle erreur d'appel de cible ou u ntruc comme ca...

    une idee ??

    Merci

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    question bête : tu as déjà créé (instancié) la MainForm à ce stade ?
    Sinon, a priori ce n'est pas au moment de fermer le splash qu'il faut faire ça... c'est plutôt au moment où tu l'affiches, tu lances un nouveau thread qui va faire l'Invoke.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/07/2010, 17h39
  2. Thread fige chargement winform
    Par syl20_44 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 21/10/2009, 20h16
  3. Réponses: 1
    Dernier message: 18/01/2008, 13h17
  4. Réponses: 2
    Dernier message: 18/07/2006, 12h20
  5. [VB.NET][WINFORMS] Multi threading
    Par joKED dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/02/2006, 11h48

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