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 :
"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 :
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 |
Partager