Comment arrêter / stopper une ligne de commande ???

Résolu
pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 janvier 2013 - 27 oct. 2009 à 19:37
Marroubi Messages postés 51 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 30 octobre 2009 - 2 nov. 2009 à 09:54
Bonjour tout le monde, voici mon problème, j'espère que quelqu'un pourra me renseigner.

De manière générale, je voulais savoir comment arrêter/stopper une ligne de commande !!!

Mon programme :

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 (J'ouvre 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 (J'exécute la commande)

Voila, je n'ais plus qu'a 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 d'attente avant une réponse.
La ligne de commande « Mon_Tableau_Reponse.Read » se bloque alors jusqu'à réponse.

J'aimerais pouvoir ajouter un bouton « Arrêter »
Je voulais donc savoir si il était possible d'arrêter/annuler/stopper cette ligne de commande (sur le clique d'un bouton par exemple) ???

Merci d'avance

8 réponses

Marroubi Messages postés 51 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 30 octobre 2009 2
27 oct. 2009 à 20:14
Salut tout le monde,

bien sur c'est possible d'arrêter un traitement même lors de son exécution,
mais comment?
voila, il y a la notion de Thread dans la technologie DotNet.
veuillez chercher avec ce mot clé et tu trouvera qu'il est possible de faire ce que tu vu
.

Bonne Casse-tête
3
pattex62 Messages postés 26 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 20 janvier 2013
30 oct. 2009 à 01:02
Merci
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 à 01:07
Après test, le Thread fonctionne super bien, le problème c'est que je n'arrive pas à l'arrêté car il bloque sur l'instruction ".read" . J'ai donc posté un autre message expliquant le problème "Comment arrêter un Thread dont l'une de ces instructions est bloquée ?"
0
Marroubi Messages postés 51 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 30 octobre 2009 2
30 oct. 2009 à 09:53
Bonjour,

si tu as introduit la notion de thread à ton traitement, bien sur tu va utiliser un objet BackgroundWorker.

avec cet objet tu peux suivre ton traitement, cad est ce qu'il a terminé avec succès, ou il a échoué, même tu peux récupérer l'erreur bloquant le traitement.

exemple d'une méthode de l'objet BackgroundWorker avec une indication de l'emplacement de l'erreur:

 Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        If Not (e.Error Is Nothing) Then
    MSGBOX( "Une erreur est survenue ! Détail : " + e.Error.Message)
        ElseIf e.Cancelled Then
            MSGBOX("Le traitement a été interrompu par l'utilisateur.")
        Else
           MSGBOX("Traitement terminé avec succès pour ")
        End If
    End Sub


Bonne Casse-Tête.
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:31
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)

J'aimerais pouvoir forcer l'arret du Thread directement sans attendre les 2 à 5 minutes de l'instruction ...

Dou ma question :

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 ???

PS : idem avec un BackgroundWorker
0
Marroubi Messages postés 51 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 30 octobre 2009 2
30 oct. 2009 à 15:39
Bonjour,

Si j’ai bien compris, le problème est dans la façon ou la méthode de l’utilisation de la notion de thread.

Alors, est ce que tu as utilisé un BackGroundWorker ou non ?

Voila, un exemple d’utilisation de ce contrôle :

[*] Pour lancer le deuxième flux met ce code dans l’emplacement convenable :

'Lancer le contrôle backgroundWorker pour démarrer l'execuion en arrière-plan.
Me.BackgroundWorker1.RunWorkerAsync()


[*] Ici on met le traitement qu’on veut passer en arrière plan, pour ton cas la boucle de parcours doit être ici :

    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
       'Le traitement ici.
    End Sub


[*] On suppose qu’on a un bouton annuler qui permet d’annuler le traitement, dans le code Bhind de ce bouton on met ce code pour arrêter le deuxième flux qui s’exécute en arrière plan :

'Demande d'annulation de l'opération d'arrière-plan en attente.
Me.BackgroundWorker1.CancelAsync()


Bonne Casse-Tête.
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 à 22:47
Oui, j'avais déjà essayé avec un Backgrounworker, mais le problème reste le même.
A savoir une fois lancer, tant que mon instruction "Datareader.Read" présent dans mon ".DoWork" n'est pas totalement terminée (soit de 2 à 5 minutes d'attente) l'arrêt du Backgrounworker est impossible.

L'opération ".CancelAsync()" du Backgrounworker attend d'arriver à un point sure pour arrêter le Backgrounworker en question. Implicitement, il n'arrête pas une ligne de commande en plein travail, il attend l'achèvement de cette ligne en cours puis force l'arrêt du Backgrounworker.

Moi, je voudrai FORCER l'arrêt de ce Thread ou Backgrounworker même si l'instruction "Datareader.Read" est en cours ... donc sans attendre la fin d'exécution de cette dernière.

Le code, cela donne rapidement :

Private Sub Mon_Backgrounworker(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
...
Mon_DataReader.Read
...
End Sub

Private Sub Mon_Bouton_Stop() Handles Bouton_Stop.click
BackgroundWorker1.CancelAsync()
End sub
0
Marroubi Messages postés 51 Date d'inscription lundi 18 mai 2009 Statut Membre Dernière intervention 30 octobre 2009 2
2 nov. 2009 à 09:54
Bonjour ,

Alors j'ai fait ce que te donne et marche chez moi sans problème. envoi moi ton code et je le vérifiera.

Bonne Casse-Tête.
0
Rejoignez-nous