IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Mettre le programme VB en stand-by jusqu'à la fin d'un thread et aussi pouvoir arrêter le thead ?


Sujet :

VB.NET

  1. #1
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut Mettre le programme VB en stand-by jusqu'à la fin d'un thread et aussi pouvoir arrêter le thead ?
    Bonjour à tous !

    La question parait simple mais la solution ne l'est pas !

    Le problème :

    Depuis le programme en VB démarrer un Task asynchrone (le Task est un .exe tiers)
    puis le programme VB reviens à la ligne suivante qu'il exécute. Situation normal mais à ce niveau il faut créer un stand-by à l'exécution du code ci-dessous ! Et je ne trouve pas la solution !

    A la question : Pourquoi lancer un thread asynchrone et vouloir attendre la fin du thread ? Ma réponse :

    1/ Faire autre chose pendant l'exécution qui dure de 1s à plusieurs jours...
    2/ Pouvoir arrêter le Task3 avec un bouton sur le form ou ToolStrip. Et donc ce bouton doit pouvoir être opérationel.

    Divers solutions essayées sans trouver la solutions :

    3/ Mettre un thread.sleep n’est pas la solution, car l’exécution suivant le cas peut prendre une seconde jusqu’à 3 jours avec un processeur I 9900!

    4/ Mettre une boucle (do loop ou while wend) ne me permet plus d'arrêter le thread avec STOP le bouton n'est plus opérationel !

    5/ Mettre un MsgBox ne va pas non plus car MsgBox est modale !

    6/ Le programme ci-dessous en test. Le call FinModuleResolution() ci-dessous s’exécute sans attendre la fin de Task3 et rend la main sans les résultats escomptés. Si j’enlève le Call FinModuleResolution() ci-dessous je n’ai pas l’affichage des solutions trouvées !

    Le but final de l’opération est d'utiliser FinModuleResolution() une fois que Task3 à donné ses résultats sur un fichier .txt puis l'afficher (donc Task3 à fini )


    Le programme qui pose problème :

    Sur le form il y a deux boutons un qu'on appel Résoudre et l'autre Stop


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Public Async Sub Resoudre_Click(sender As Object, e As EventArgs) Handles Solve.Click
     
           Try
            'Lit les datas servi à Task 3 dans le fichier .txt
            Dim monStreamReader4 As New StreamReader(Disk + "\datainput.txt")
     
            Do Until monStreamReader4.Peek = -1 'si = -1 => jusqu'à la dernière ligne du fichier
                LecturemonStreamReader3 = monStreamReader4.ReadLine() + vbNewLine
                EnoncePopeyeBrut += LecturemonStreamReader3 
            Loop
            monStreamReader4.Close()
     
            Thread.Sleep(150)
     
            'résoud le problème ici, appel function task3() :
     
            Call New List(Of Task)().Add(Task.Run(AddressOf Task3))
            Await Task.WhenAll(New List(Of Task)())
     
            Thread.Sleep(150)
     
            'attend la fin de Task3
            Call New List(Of Task)().Add(Task.Run(AddressOf Task4))
            Await Task.WhenAll(New List(Of Task)())
            Thread.Sleep(150)
     
    !!!!!! Il faut créer ici une instruction d'attente non modale vérifiant si buton stop est appuyé qui arrête Task3. !!!!!!!
     
    Call FinModuleResolutionPopeye()
     
        Catch ex As Exception
         ‘…
        End Try
     
    End Sub 
     
     Public Sub StopSolving_Click(sender As Object, e As EventArgs) Handles StopSolving.Click
         'Stop solving button in toolstrip head line. This sub work with the Sub StopSolving_MouseEnter !
         Try
             Dim qqq As Process = Process.GetProcessById(LeProcess1)
             qqq.Kill()
             Stop_solving.Visible = False
     
         Catch ex As Exception
         End Try
     
     End Sub
     
     Private Async Function Task3() As Task 'démarre pywin64.exe
     
         Using myProcess1 As New Process
             Try
     
                 myProcess1.StartInfo.Arguments = vbNormalFocus
                 myProcess1.StartInfo.FileName = Disk + "\pywin64.exe"
                 myProcess1.StartInfo.Arguments = Disk + "\datainp.txt"
     
                 'démarre l'exe
                 LeProcess1 = Process.Start(myProcess1.StartInfo).Id
                 Thread.Sleep(300)
     
             Catch ex As Exception
                 MessageBox.Show(ex.Message & "Stack Trace: " & vbCrLf & ex.StackTrace)
             End Try
         End Using
         Await Task.WhenAll()
    Il faut donc un point d’attente qui n’empêche pas de faire autre chose dans le programme ni d’arrêter le Task3 avec la touche STOP. Une fois le Task3 fini ce point d’attente est supprimé et le programme continu avec la lecture de FinModuleResolution()

    Comment mettre un point d’attente? Point d’attente qui ne doit pas être 'modale' comme un MsgBox !

    Il semble d'après la littérature que cela peut se faire en lançant le thread 3 et 4 et le thread 4 attends que thread 3 finisse mais je n'arrive pas à le mettre en pratique dans mon exemple ! Le lien : https://stackoverflow.com/questions/...ting-next-step

    Si vous avez une idée?

  2. #2
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Pour info pour faire des tests en situation pratique :

    Vous pouvez utiliser le programme pywin64.exe pour le Task3 et le programme décit au point #6 de l'article précédent : " Trouver le handle d'un EXE permettant de garder le Form actif pour pouvoir arrêter l' EXE ? "

    Car c'est dans ce code là in fine que je doit intégrer les lignes de codes.

    A bientôt pour vos idées.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 501
    Par défaut
    une boucle while/do..loop en testant un booleen de l'état du STOP avec un thread.sleep ?

  4. #4
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Citation Envoyé par umfred Voir le message
    une boucle while/do..loop en testant un booleen de l'état du STOP avec un thread.sleep ?
    Bonsoir,

    Je vais essayé cela à condition de trouver le bon état à tester. A mon avis ça ne sera pas focus ni select.

    Nom : Propriétés du bouton Stop.jpg
Affichages : 160
Taille : 95,0 Ko

    Visible, Enabled?

    A+

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 501
    Par défaut
    une variable que tu positionnes toi même à la main (du genre IsTaskRunning à True lors du lancement de la tâche, et à False lors de l'arrêt dans ton bouton)

  6. #6
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    J'ai écrit et testé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     Dim IsTaskRuning = False
     
     Public Sub ResoudreToolStripButton_Click(sender As Object, e As EventArgs) Handles SolveProbToolStripButton.Click
     
         Call SolvingToolStrip()
     
         IsTaskRuning = True
     
    Dim ppp() As Process
     
     StopSolving.Select()
     
    Do While IsTaskRuning = True
     
     'Recherche l'état du thread (ici un .exe) en cours d'execution 
        ppp = Process.GetProcessesByName("pywin64")
        If ppp.Count = 0 Then IsTaskRuning = False
        Thread.Sleep(300)
    Loop
     
    Exit Sub
     
     
     StopSolving.PerformClick()
     
     Thread.Sleep(2000)
     
    ....
     
    End Sub
     
    'code du bouton toolstrip : STOP
     Public Sub StopSolving_Click(sender As Object, e As EventArgs) Handles StopSolving.Click
     
         'Stop solving button in toolstrip head line. This sub work with the Sub StopSolving_MouseEnter !
         FlagStopSolving = True
         Try
             Dim qqq As Process = Process.GetProcessById(LeProcess1)
             qqq.Kill()
             Stop_solving.Visible = False
         Catch ex As Exception
         End Try
     
     End Sub
    Il est impossible d'appuyer sur STOP car il est inaccessible tant que la boucle do loop tourne !

    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     Do While IsTaskRuning = True
         StopSolving.Checked = True
     
         ppp = Process.GetProcessesByName("pywin64")
         If ppp.Count = 0 Then IsTaskRuning = False
         StopSolving.Select()
         Refresh()
         Thread.Sleep(300)
        Loop
    ne change rien

  7. #7
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonsoir Excalybur,

    Peut-être qu'un StopSolving.Refresh au lieu de seulement Refresh foncionnera.
    Sinon, remplacer StopSolving.Refresh par Application.DoEvents().

    J'ai pas testé ton code ...

  8. #8
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    J'étais en train de lire https://learn.microsoft.com/fr-fr/ar...ation-doevents et https://stackoverflow.com/questions/...71728#45571728
    quand j'ai vu ton message. Les grands esprits ...

    Effectivement avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Do While IsTaskRuning = True
        StopSolving.Checked = True
     
        ppp = Process.GetProcessesByName("pywin64")
        If ppp.Count = 0 Then IsTaskRuning = False
        StopSolving.Select()
        Refresh()
     
        Application.DoEvents()
     
       Thread.Sleep(300)
      Loop
    Application.DoEvents fonctionne comme je le souhaite !!!

    Une petite ligne de code pour résoudre tant de problèmes

    Un grand merci à tous je vais enfin pouvoir finaliser proprement mon application.

    Bonne soirée.

  9. #9
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bien, mais je crois que tu peux enlever le Refresh().
    ....

  10. #10
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Oui déjà fait, effectivement refresh() n'est pas utile dans cette boucle.

    Merci pour le rappel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Javascript/ ASP] Verrou sur la page jusqu'à la fin du chargement
    Par luimême dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/02/2008, 09h34
  2. Réponses: 8
    Dernier message: 09/05/2007, 17h00
  3. Série de points jusqu'à la fin de de la cellule
    Par Joe Le Mort dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 29/09/2006, 20h11
  4. Réponses: 22
    Dernier message: 29/08/2006, 16h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo