[Déplacé de VB6 à .Net (si si)] Comment arrêter un Thread dont l'une de ces inst
pattex62
Messages postés26Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2013
-
30 oct. 2009 à 00:55
pattex62
Messages postés26Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2013
-
30 oct. 2009 à 13:34
Bonjour tout le monde, j'espère que quelqu'un pourra m'aider à trouver la réponse à mon problème, le voila :
Comment arrêter un Thread dont l'une de ces instructions est bloquée ?
Explication :
A l'intérieur de mon Thread principal (Mon programme) je lance un second Thread parallèle (que j'appel "Second" par exemple), cela donne :
Dim Second As New System.Threading.Thread(Addressof MonCalcul)
Second.Start()
Private Sub MonCalcul()
Instruction N°1
Instruction N°2
Instruction N°3
...
End Sub
Hors "Second" peut rester bloquer sur l'instruction N°2 (l'attente de lecture d'un flux par exemple, ...).
Il y a deux manières (que je connais) pour arrêté un "Thread" :
1. Utiliser une valeur booléenne qui est censée permettre d'arrêter "Second" à l'intérieur de son code via une boucle du genre "While(booleen) faire?"
2. Utiliser directement Second.Abort()
Comme "Second" est bloqué sur l'instruction N°2, ni l'une ni l'autre ne fonctionne. Une fois l'instruction N°2 déclenchée, impossible d'arrêter le Thread tant que l'instruction N°2 n'est pas terminée.
pattex62
Messages postés26Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2013 30 oct. 2009 à 04:02
Quelques mots sur l'instruction N°2 :
Il s'agit de la commande ".Read" d'un DataReader
Explication :
Via une requête SQL définie, mon programme consulte une base de données, « Oracle » dans mon cas, puis retourne le résultat dans un « ListView ».
Soit trois objets :
Ma_Connexion : « System.Data.OracleClient.OracleConnection »
Ma_Commande : « System.Data.OracleClient.OracleCommand »
Mon_Tableau_Reponse : « System.Data.OracleClient.OracleDataReader »
Pour consulter, rien de plus simple :
Ma_Connexion.ConnectionString = "..." (Je définie ma connexion)
Ma_Connexion.Open (Jouvre ma connexion)
Ma_Commande.Connection = Ma_Connexion (Je lie ma commande à ma connexion)
Ma_Commande.CommandText = "SELECT ... FROM ... WHERE ..." (Je définie ma requête SQL)
Mon_Tableau_Reponse = Ma_Commande.ExecuteReader (Jexécute la commande)
Voila, je nais plus qua consulter « Mon_Tableau_Réponse » via une belle boucle du genre :
Do While Mon_Tableau_Reponse.Read
...
Loop
Mon problème :
Certaine de mes requêtes son très gourmandes, plus de 3 à 5 minutes dattente avant une réponse.
La ligne de commande « Mon_Tableau_Reponse.Read » se bloque alors jusqu'à réponse.
Jaimerais pouvoir ajouter un bouton « Arrêter »
Je voulais donc savoir si il était possible darrêter/annuler/stopper cette ligne de commande (sur le clique dun bouton par exemple) ???
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 30 oct. 2009 à 10:39
Re
Ô Racle, Ô désespoir, Ô sql ennemi ...
En effet, ça fait long.
Il faut peut-être revoir la structure des tables auxquelles tu t'adresses.
Peut-être un problème d'organisation des champs indexés (qui manqueraient).
Revoir peut être aussi la requète.
Es-tu obligé de récupérer tout en une seule requète ?
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
pattex62
Messages postés26Date d'inscriptiondimanche 7 décembre 2003StatutMembreDernière intervention20 janvier 2013 30 oct. 2009 à 13:24
Malheureusement je n'ai pas le choix décidément !!! Snifff
La requête est très longue dans le sens ou il y a plusieurs niveaux de "Select", Un "Union" et plus de "128 000 000" enregistrements à l'intérieur des deux tables consultées ?
2 à 5 minutes d'attente est très raisonnable (je pense) pour "Oracle" et au vu de la taille de ma requête ?
Le problème c'est une fois la demande "Datareader.Read" déclenchée, le Thread est gelé sur cette instruction (sans possibilité d'arrêt) jusqu'à réponse du Datareader (soit 2 à 5 minutes)
Vous n’avez pas trouvé la réponse que vous recherchez ?