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 :

Petit Problème "Threadesque"


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut Petit Problème "Threadesque"
    Bonjour à tous.
    Je m'initie aux thread.
    Sur ma form j'ai un textbox (TB1) et un DataGridView (DGV1)
    TB1 sert a filtrer les donnees dans DGV1, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT MonChamp FROM Ma Table WHERE MonChamp LIKE '" & TB1.Text & "%'"
    La Table en question comporte plus de 40 000 Lignes et du coup les premières requètes sont un peu longuette.
    Je veux donc lancer un thread dès que TB1 obtient le Focus et remplir un Dataset avec toutes les données de la table puis peupler le DGV via une dataview.
    Pour commencer, je lance donc mon thread dans TB1.GotFocus
    Je me fous pour l'instant de la DataView et je remplis directement le DGV avec toutes les donnees de la table, histoire de voir déjà si ca marche.
    Et ca marche ! ... Le problème c'est que pendant que le Thread s'execute, je ne peut pas utiliser la TB correctement (rien ne s'affiche tant que le DGV n'est pas chargé)
    En gros, Le Thread ne sert à rien, vu que le tread principal semble bloqué pendant l'execution du secondaire !
    Qlqun a t'il une idée sur le pourquoi du comment ?
    Voici mon code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    Imports System.Data.SqlClient
    Imports System.Threading
     
    Public Class Form1
     
        Private Sub TB1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TB1.GotFocus
            Dim T As Thread = New Thread(AddressOf ExecutionThread)
            T.Start()
        End Sub
     
        Private Delegate Sub Resynchronisation(ByVal D As DataTable)
     
        Private Sub ExecutionThread()
            Dim SQLcnx As New SqlConnection("MaChaineDeConnexion")
            Dim SqlAdp As SqlDataAdapter = New SqlDataAdapter("SELECT MonChamp FROM MaTable ORDER BY MonChamp ", SQLcnx)
            Dim DTset As New DataSet
            SqlAdp.Fill(DTset)
            SQLcnx.Close()
            Dim TableauDObjets() As Object = {DTset.Tables(0)}
            Dim Del As Resynchronisation = New Resynchronisation(AddressOf ExecutionSynchrone)
            DGV1.BeginInvoke(Del, TableauDObjets)
        End Sub
     
        Private Sub ExecutionSynchrone(ByVal D As DataTable)
            DGV1.DataSource = D
        End Sub
    End Class

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Je ne vois pas à quel moment tu utilises les threads dans ton exemple. Il doit manquer cette partie du code, non ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut
    Ben .. heu .. dans le GotFocus Non ?
    En tous cas le DGV se rempli comme voulu ...

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Ah oui excuse moi, je n'avais pas vu.

    Pour répondre à ton problème, c'est normal que ton dgv soit "bloqué" lors du chargement, car en utilisant Invoke, tu exécutes le chargement dans le thread qui s'occupe de l'affichage.
    Dans ton exemple, la requête s'exécute en arrière plan, mais le chargement du contrôle s'effectue dans le thread principal.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 240
    Par défaut
    Je vois ce que tu veux dire.
    Mais ce n'est pas mon DGV qui est bloqué, c'est la TextBox qui contient le focus et avec laquelle il ne se passe rien pendant l'execution du Thread.

    D'autre part (les notions de temps sont souvent subjectives mais ...) il me semble que la textBox est bloquée dès le démarrage du thread (durant l'accès a la base de donnée) et non pas seulement lors de l'affichage du resultat.
    Charger 40 000 lignes prend j'imagine un certain temps et le bloquage est lui immédiat (du moins il me semble)...

    Je vais quand même essayer mon code jusqu'au bout (c'est a dire en chargeant un dataset et en n'affichant que le nécessaire via le filtre d'une dataview) voir si ca marche...

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Que ce soit le dgv ou le textbox ne change rien. En fait comme le chargement se fait dans le thread de l'UI, c'est toute la fenêtre qui est "bloquée".
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

Discussions similaires

  1. petit problème de quotes
    Par mitje dans le forum Struts 1
    Réponses: 1
    Dernier message: 17/10/2006, 07h03
  2. petit problème de quote
    Par Choupinou dans le forum Oracle
    Réponses: 7
    Dernier message: 27/06/2006, 17h14

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