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 :

datagridview et fermeture de form


Sujet :

VB.NET

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut datagridview et fermeture de form
    Bonjour,

    j'ai une fenêtre qui met environ 10 sec avant de se fermer.
    j'ai identifier ce que je pense être le coupable, c'est le datagridview qui est sur la form.
    Si je ne le remplit pas la form se ferme immédiatement.

    code simplifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub _BackgroundWorker_historique_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles _BackgroundWorker_historique.DoWork
       chp_historique.DataSource = Ici_Une_Data_Table
    End Sub
    J'voudrais bien un peu d'aide car je ne sais pas comment résoudre ce problème.


    PS : le datagridview à très peu de ligne, inférieur à 10

    Ps2 : j'viens de trouver aussi que le pb vient du fait que le remplissage se fait dans un BackgroundWorker.DoWork.
    Si je lance en dehors pas de PB.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Je tente une réponse sans être sur car je n'utilise pas ce genre de connexion.
    Le fait de connecter une datatable directement au datagridview maintient la connexion à la BD ouverte, dans le cas ou cette datatable est connectée à un BD en lecture écriture non ? D'où la fermeture de la connexion par le garbage collector lorsque l'on ferme la fenêtre (là je suis pas trop sur).

    Pour ma part je connecte et déconnecte la base de donnée à un objet métier pour chaque requête sur la base (injectée via une méthode de l'objet métier), l'objet métier contenant une une bindinglist(of ..) instanciée via la requête cette bindinglist étant la source de donnée du datagridview. Pour plusieurs centaines de lignes la fermeture de la form contenant le datagridview est instantanée.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut
    Merci d'avoir essayé mais je dirais non pour plusieurs raisons

    Dans un premier temps ma connexion est global au projet
    (Le dev à beaucoup ouverture/fermeture de fenêtre et parfois avec des personnes distantes, donc une réouverture à chaque fois serait trop long).

    Si je suis ton explication cela n'explique pas pourquoi sans le BackgroundWorker (traitement multitâche) le travaille se fait correctement.

    Et mon datatable n'a plus de lien avec la bdd, il est en mode déconnecté.


    Si tu as d'autre idée je suis preneur

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Zut j'avais pas vu le PS2 (je suis plutôt XBox ) là je sèche

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    As-tu interrompu le BackGroundWorker avant le close de l'appli ?

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    c'est déjà étonnant que le datagrid veuille bien un datasource sur un autre thread !
    tu peux charger les données sur un autre thread, mais il faut les assigner à l'interface graphique sur le thread principal


    Citation Envoyé par Geo2A Voir le message
    Bonjour,

    Je tente une réponse sans être sur car je n'utilise pas ce genre de connexion.
    Le fait de connecter une datatable directement au datagridview maintient la connexion à la BD ouverte, dans le cas ou cette datatable est connectée à un BD en lecture écriture non ? D'où la fermeture de la connexion par le garbage collector lorsque l'on ferme la fenêtre (là je suis pas trop sur).
    un datatable n'est qu'un stockage des données, donc la connextion n'est pas gardé
    de plus fermer une connexion prend quelques millisecondes dans le pire des cas

    quant au garbage collector, il n'est pas synchrone donc ne peut pas bloquer le thread principal (il n'est d'ailleurs appelé que quand l'os a besoin de mémoire)

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut
    Envoyé par Pol63

    c'est déjà étonnant que le datagrid veuille bien un datasource sur un autre thread !
    En théorie non, justement j'avais une croix rouge à place du datagridview et dans un autre poste on ma conseillé le BackGroundWorker (que je découvre)


    Envoyé par Graffito

    As-tu interrompu le BackGroundWorker avant le close de l'appli ?
    je découvre le BackGroundWorker et je savais pas qu'il fallait le fermer et comment fait on ?

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    je découvre le BackGroundWorker et je savais pas qu'il fallait le fermer et comment fait on ?
    BackGroundWorker.CancelAsync()

  9. #9
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut
    en fait j'ai testé cette partie avant de répondre tout à l'heure, et vu que ça fonctionnait encore moins je me suis dit que ce n'était pas ça

    j'ai mis BackGroundWorker.CancelAsync() dans l’évènement FormClosing et pour le coup la fenêtre ne se ferme pas du tout.
    quand le code passe sur BackGroundWorker.CancelAsync() , ça annule le FormClosing comme pour un e.cancel=true

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    beaucoup de choses fausses ici !

    cancelasync sert à annuler le traitement pendant le dowork, mais seulement si tu as implémenté le code nécessaire, sinon l'appel de cancelasync plante ou ne fait tout simplement rien
    cancelasync pourrait en effet appelé dans le form closing mais seulement si le dowork n'a pas fini, et comme dit précédemment il faut gérer soi même la sortie du dowork

    le backgroundworker est l'équivalent d'un thread
    le dowork esst sur un autre thread, et ses autres évènements sont sur le thread principal et permettent de passer des données en paramètres

    donc pendant le dowork tu ne dois rien faire sur l'interface graphique, mais sur l'event reportprogress ou completed

  11. #11
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut
    Désolé je début complètement en thread et là je comprend plus rien.

    Comment ne rien faire sur l'interface et remplir mon datagridview ?
    et dans mon cas je n'ai pas de progress et rien à faire quand c'est terminé !

    Je pense qu'en réalité je ne suis pas sur la bonne voie avec mon BackGroundWorker qui semble être plus pour savoir l'évolution des taches, alors que moi j'en ai qu'une mais qui dure dans le temps !

    Si je fais fausse route comment remplir mon datagridview sans bloqué la saisie sur la form ?

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    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 177
    Points : 25 125
    Points
    25 125
    Par défaut
    le backgroundworker peut etre utilisé quand on a qu'une seule tache longue

    le truc c'est que pendant l'exécution de code sur le thread principal (celui par défaut) l'interface graphique est gelée ("ne répond pas" de windows)
    pour moins d'une demie seconde de traitement ca n'est pas grave, pour moins de 2 dixième de secondes ca ne se voit même pas

    dès qu'on dépasse se temps, il faut alors faire le traitement sur un autre thread
    le backgroundworker est une classe qui encapsule tout ce qui est utile pour du multithreading simple, à savoir : gestion de report de progression, avertissement de fin, possibilité d'annuler le traitement

    ton traitement doit etre à priori de remplir un datatable et de mettre ce datatable dans un dgv, il faut alors remplir le datatable sur le 2ème thread, et l'assigner au dgv sur le 1er

    description du backgroundworker
    WorkerReportsProgress : mettre à true avant de le démarrer permet de dire qu'on veut utiliser le report progress
    WorkerSupportsCancellation : mettre à true avant de le démarrer permet de dire qu'on veut pouvoir annuler le thread sans le terminer
    RunWorkerAsync : permet de démarrer le thread => l'évènement DoWork est alors appelé sur le thread secondaire

    Pendant le DoWork, en plus de son traitement il est possible d'appeler la méthode ReportProgress et de lui passer un pourcentage et en plus un Object, cet évènement est déclenché sur le thread principal, permettant la mise à jour de l'interface
    le pourcentage est à calculer soi même selon ce qu'on fait, ca ne devine pas
    et dans l'object on peut passer des classes de données, et alors créer des controles et leur assigner les données passées

    Concernant l'annulation du traitement, on doit coder ca soit même, quand on veut arrêter le thread il faut appeler CancelAsync, mais celui ne fait que setter le booléen CancellationPending à true, il faut donc dans la sub lié à DoWork vérifier la valeur de ce booléen, et s'il vaut true faire un Exit Sub
    l'annulation se prete bien à l'utilisation d'une boucle, car on peut vérifier le booléen à chaque tour
    On est pas obligé de faire l'exit sub tout de suite, on peut refermer proprement ce qu'on était en train de faire

    A la sortie de la sub lié à l'évènement DoWork, l'évènement RunWorkerCompleted est déclenché, et sur le thread principal
    sur cet évènement dans e on retrouve la propriété Error, qui contient l'erreur qui a fait s'arreter le dowork (tout du moins si on a pas mis de try catch dans la sub)
    il y a aussi une propriété Result qui contient ce qu'on a placé dans e.result sur la méthode qui handle l'event DoWork permettant là encore de passer des données
    pour faire transiter les données, on peut aussi tout bettement remplir une variable déclarée dans la même classe que le backgroundworker (un form dans ton cas je pense)

    bref sur le dowork tu remplis ton datatable, tu fais e.result = mondatatable
    et dans le completed tu fais mondgv.datasource = directcast(e.result,datatable) et tu nous dis si tu as encore des soucis

  13. #13
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut
    Pol63 tu mérites bien ton "Expert Confirmé Sénior"

    Super réponse ultra complète, j'ai tout compris et le plus ça marche trop bien


    ps : j'ai oublié le plus important, grand merci à vous tous !

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

Discussions similaires

  1. fermeture des formes
    Par senda dans le forum C#
    Réponses: 3
    Dernier message: 02/04/2008, 23h49
  2. Fermeture de form étrange
    Par Gdal dans le forum VB.NET
    Réponses: 5
    Dernier message: 05/04/2007, 21h29
  3. Problème de fermeture de forme ShowModal
    Par keisha dans le forum Delphi
    Réponses: 5
    Dernier message: 12/09/2006, 19h33
  4. [Form] ordre de fermeture des forms
    Par ip203 dans le forum IHM
    Réponses: 2
    Dernier message: 14/06/2006, 14h08
  5. [VB.NET] thread interrompu lors d'une fermeture de form ?
    Par HULK dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/01/2006, 15h00

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