[Déplacé de VB6 à .Net (si si)] Comment arrêter un Thread dont l'une de ces inst

pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 janvier 2013 - 30 oct. 2009 à 00:55
pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 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.

Comment forcer l'arrêt du Thread ???

Merci d'avance

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
30 oct. 2009 à 01:14
Salut
Si le blocage de l'instruction 2 est un blocage du système, rien à faire.
Ne connaissant pas cette instruction 2, impossible de t'en dire plus.

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)
0
pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 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) ???

Visiblement via un Thread je n'arrive pas ...
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
0
pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 janvier 2013
30 oct. 2009 à 13:34
Ma question donc :

J'aimerais pouvoir forcer l'arret du Thread directement sans attendre les 2 à 5 minutes de l'instruction (gelée) ...
0
Rejoignez-nous