Comment arrêter / stopper une ligne de commande ??? [Résolu]

pattex62 26 Messages postés dimanche 7 décembre 2003Date d'inscription 20 janvier 2013 Dernière intervention - 27 oct. 2009 à 19:37 - Dernière réponse : Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention
- 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
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention - 27 oct. 2009 à 20:14
3
Merci
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

Merci Marroubi 3

codes-sources a aidé 87955 internautes ce mois-ci

Commenter la réponse de Marroubi
pattex62 26 Messages postés dimanche 7 décembre 2003Date d'inscription 20 janvier 2013 Dernière intervention - 30 oct. 2009 à 01:02
0
Merci
Merci
Commenter la réponse de pattex62
pattex62 26 Messages postés dimanche 7 décembre 2003Date d'inscription 20 janvier 2013 Dernière intervention - 30 oct. 2009 à 01:07
0
Merci
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 ?"
Commenter la réponse de pattex62
Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention - 30 oct. 2009 à 09:53
0
Merci
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.
Commenter la réponse de Marroubi
pattex62 26 Messages postés dimanche 7 décembre 2003Date d'inscription 20 janvier 2013 Dernière intervention - 30 oct. 2009 à 13:31
0
Merci
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
Commenter la réponse de pattex62
Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention - 30 oct. 2009 à 15:39
0
Merci
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.
Commenter la réponse de Marroubi
pattex62 26 Messages postés dimanche 7 décembre 2003Date d'inscription 20 janvier 2013 Dernière intervention - 30 oct. 2009 à 22:47
0
Merci
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
Commenter la réponse de pattex62
Marroubi 51 Messages postés lundi 18 mai 2009Date d'inscription 30 octobre 2009 Dernière intervention - 2 nov. 2009 à 09:54
0
Merci
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.
Commenter la réponse de Marroubi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.