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 :

Récupérer chaque caractère d'un message de sortie d'un processus "Remuxtool"


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut Récupérer chaque caractère d'un message de sortie d'un processus "Remuxtool"
    Bonsoir à tous,
    j'espère que vous pourrez m'aider, Je suis devant un problème un peu spécifique.
    Je cherche à récupérer chaque caractères d'une ligne émise par RemuxTool (lancer par un objet Process).
    Cette ligne à une particularité : C'est une suite de caractéres : "_" ajouté un par un pour représenter la progression du processus.
    problème : En VB.NET je sais lire des lignes entières mais pas caractère par caractère. Hors j'ai besoin de détecter l’émission de chaque caratére pour faire mon propre formulaire de progression avec progressBar et calcul du temps restant...etc.

    Voici le code que j'utilise et qui fonctionne trés bien quand il s'agit de lire ligne par ligne. :

    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
        Private Sub ShellExecute(ByVal ExeFile As String, CommandLine As String)
     
            Dim MonProcess As New Process
            AddHandler MonProcess.OutputDataReceived, AddressOf OutputDataReceived
            AddHandler MonProcess.ErrorDataReceived, AddressOf ErrorDataReceived
            AddHandler MonProcess.Exited, AddressOf ProcessExit
     
            'MonProcess.SynchronizingObject = Me
            MonProcess.EnableRaisingEvents = True
     
            MonProcess.StartInfo.FileName = ExeFile
            MonProcess.StartInfo.Arguments = CommandLine
            'MonProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized
            MonProcess.StartInfo.CreateNoWindow = True        ' True
            MonProcess.StartInfo.UseShellExecute = False      ' False
            MonProcess.StartInfo.RedirectStandardOutput = True
            MonProcess.StartInfo.RedirectStandardInput = True
            MonProcess.StartInfo.RedirectStandardError = True
     
     
            MonProcess.Start()
     
            MonProcess.BeginOutputReadLine()
            MonProcess.BeginErrorReadLine()
     
     
            MonProcess.WaitForExit()
            MonProcess.Close()
        End Sub
    Les Evenements DataReceived :
    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
        Private Sub OutputDataReceived(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)
     
            Try
                ProcessOutputData = e.Data.ToString
                Invoquer(e.Data.ToString)
                Debug.Print(e.Data.ToString)
            Catch ex As Exception
     
            End Try
     
        End Sub
     
        Private Sub ErrorDataReceived(sender As Object, e As System.Diagnostics.DataReceivedEventArgs)
     
            Try
                ProcessOutputData = e.Data.ToString
                Invoquer(e.Data.ToString)
                Debug.Print(e.Data.ToString)
            Catch ex As Exception
     
            End Try
     
        End Sub
    Merci beaucoup si vous avez une idée.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour, je ne suis pas certain d'avoir beaucoup de solution pour ce problème là .
    Je connais quelqu'un qui à réussi à le faire en Delphi en redirigeant en temps réel se qui s'affiche dans la fenêtre Dos (sans que la fenêtre Dos s'affiche). En Delphi ça s'appelle "Doscommand".
    C'est peut-être une piste mais je ne sais pas si une telle fonction existe en VB.NET ou comment la mettre en oeuvre.

    Si vous avez des idées ça m'interresse beaucoup parce que je ne vois vraiment pas comment faire.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Bonjour,

    Je crois ne pas avoir bien compris..
    Tu arrives a lire la ligne (e.Data.ToString) mais tu veux lire caractère par caractère?
    Que contient e.Data.ToString?
    Que veux-tu récupérer?
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour et merci d'essayer de m'aider.
    e.data.ToString contient ceci :
    "-------------------------------------------------------------------------"
    soit 73 caractères "_".
    l’événement ...DataReceived est levé uniquement quand la ligne est complète (soit avec 73 caractères).
    Dans la fenêtre Dos les caratéres "_" s'affiche un par un. Si j'ai 1 caractère, cela signifie que l'encodage à progressé de 1/73 et dés que la ligne comprends les 73 caractères cela signifie que l'encodage est terminé.
    j'aimerais être avertie au fur et à mesure (dés qu'un caractére "_" est ajouté dans la ligne) afin de pouvoir afficher le pourcentage de progression et faire les calculs du temps restant dans mon programme.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Personne pour m'aider ? J'ai bien peur de ne pas pouvoir trouver la solution.

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Ca te donnera le nombre de caractère dans la chaine. Si j'ai bien compris t'a demande.
    Du coup après tu peux mettre ton increment de progressbar dans ta fonction.

  7. #7
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Dans quoi affiches-tu tes caractères ? (Si TextBox ou qlqes autres controls alors tu as l'event TextChanged, si autres tu peux stocker les caractères dans une property et dans le Set tu incrémentes un compteur)
    Où est la ligne qui génère le "-" ?
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour et merci d'essayer de m'aider.

    Dans quoi affiches-tu tes caractères ?
    Le problème n'est pas de savoir dans quoi je les affiche mais de savoir comment être notifié dans mon programme quand le Processus génère un nouveau caractère : "_", car comme je l'expliquais plus haut je suis averti dans mon programme uniquement quand le Processus a fini de générer la totalité des 73 caractères, autrement dit quand le Processus est terminé. Hors je voudrais être notifié à chaque génération de caractère sinon je ne vois pas comment faire avancer une progressbar et faire un calcul du temps restant autrement.

    Où est la ligne qui génère le "-" ?
    Ce n'est pas mon programme qui génère le caratére "_" mais le Processus externe qui est Remuxtool.

    Le problème n'est pas simple, j'espère que vous pourrez m'aider.

  9. #9
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Comme je t'ai dit, si les caractères vont dans un control (TextBox, etc) qui a l'event TextChanged, à chaque caractères rentré, un event textchanged est envoyé et dans cet event, tu peux avoir la taille du texte au moment où le caractère est rentré.

    Ou si tu arrives à faire en sorte que le processus écrive dans une property ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private _avancementProcess As String
        Private _compteurAvancementProcess As Integer = 0
        Public WriteOnly Property avancementProcess() As String
            Set(ByVal Value As String)
                _avancementProcess = _avancementProcess & Value
                _compteurAvancementProcess += 1
            End Set
        End Property

    Pour conclure, par un textchanged ou une property tu seras notifié pour chaque génération de caractère.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  10. #10
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour, c'est peut-être moi qui ai mal compris mais....
    Si je ne dit pas de bêtises l’évent TextChanged d'un control se produit lorsque l'on modifie le text de ce control depuis le code ou une entrée utilisateur. Cela m'irait bien si je pouvais entrer les caractères un par un dans ce control sauf que je ne peux pas le faire puisque je reçois une ligne entière dans l’évent DataReceived.
    Il faudrait que cet événement soit levé autant de fois que j'ai de caractères.

    Ce que je vois sur la fenêtre Dos du Process n'est pas ce que je reçois :
    Dans l'ordre chronologique :
    - Démarrage du Processus.
    Les étapes ci-dessous correspondent à ce qui s'affiche sur la fenêtre Dos (durant les 73 minutes mon programme n'est notifié de rien) :
    - Au bout d'1 minute : affichage d'un caractère "_" sur la fenêtre Dos. A cette étape je devrais être notifié dans mon programme que le Process a généré un caratére mais ce n'est pas le cas.
    - Au bout de 2 minutes : ajout d'un caractére "_" sur la même ligne que ci-dessus. Soit "__".
    ....
    - Au bout de 20 minutes : j'ai 20 caractères "_"affichés sur la même ligne que ci-dessus. Soit "____________________"
    - Au bout de 73 minutes : j'ai les 73 caractères affichés ce qui correspond à la fin du Processus.
    - Dernière étape : enfin je suis notifié dans mon programme via l'event DataReceveid, je reçois les 73 caractères mais c'est trop tard.

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    As tu accès au code source de Remuxtool ?

    Si oui vous pouvez regarder du coté de la création d'évenement.
    Ici ou le deuxième est en C# mais ça se comprend.

  12. #12
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Au temps pour moi, c'est moi qui ai mal compris en ce cas.

    Je comprend mieux ce que tu cherches à faire, mais soit on fait une lecture synchrone, et tu n'auras que le texte "final", soit une asynchrone (ce que tu fais), mais apparemment c'est aussi le texte final ... Je ne sais pas trop, en espérant que d'autres helpers auront des idées ...
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  13. #13
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    @ _Ez3kiel : Il n'y a pas de mal , c'est sympa d'avoir essayé de m'aider.
    @chaparo : hélas je n'ai pas accès au code source. Je doit faire avec les infos que le Remuxtool veux bien fournir.

    je sais que ça fonctionne en Delphi que je l'ai écrit plus haut. Je crois que la technique consiste à lire directement dans le buffer d'affichage de la console Dos de Remuxtool, un truc dans ce style mais je n'en sais pas plus.

    Merci à tous ceux qui ont des idées.

  14. #14
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir j'ai trouvé ceci mais c'est écrit en C++ et je ne sais pas comment l'utiliser, si je peux l’intégrer à mon projet et si cela réponds exactement à mon problème étant donné que je ne sais pas lire le C++..
    http://www.codeproject.com/Articles/...ut-Redirection

    Mais à mon avis je crois que je ne vais pas y arriver, ça devient trop compliqué pour moi.
    Je remercie ceux qui ont bien voulu m'aider.

  15. #15
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 235
    Points : 359
    Points
    359
    Par défaut
    Salut tout le monde,

    BasicZX:
    Je ne t'ai pas abandonné, c'est que j'ai eu du taf...

    Alors, ton histoire est bizarre, j'ai très bien compris ce que tu souhaites faire.
    Au début je me suis dit, bon ça va être "les doigts dans le nez"...
    Eh bah j'ai eu le même problème !!!
    J'ai même créé un fichier .bat qui simule (a peu-près) ton autre application:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ECHO OFF
    set /a count = 0
    :boucle
    set /a count = count + 1
    if %count%==73 goto finboucle
    (Set /P VarName=_) < NUL
    ping -n 1 1.1.1.1 -w 100 >nul
    GoTo boucle
    :finboucle
    Si je le lance avec cmd on y voit bien les "_" qui avancent progressivement et avec VB.net, eh bah... je reçois tous les caractères d'un seul coup, de manière asynchrone ou non.

    Bizarre mais on va trouver (j'espère)
    Par nature les mots, ils sont flous, c'est une fois alignés qu'ils se précisent.

  16. #16
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Pas mal ton fichier .bat ACTIVE_CS. Ça simule bien ce qui s'affiche à l’écran. Par contre je me suis trompé de caractère, c'est le caractère "-" (Tiret) qui s’affiche, du coup j'ai été vérifier dans mon programme car j'avais un doute mais c'est aussi une ligne de caractère avec des tirets que je reçois. Ce sont donc bien les mêmes caractères dans la fenêtre Dos et dans mon programme.

    Ça serait inintéressant de savoir si tu reçois bien la même chose que moi en lançant le .bat depuis la routine ShelleExecute.

  17. #17
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonojur,

    Ce tuto Exécution synchrone d'un programme console dans une application devrait pouvoir vous aidez.
    C'est en C#, mais vous avez le principe et les explications.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  18. #18
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    merci rv26t, je vais regarder ça.
    @ACTIVE_CS : je viens de tester ton fichier .bat dans mon programme.
    On a 3 événements DataReceveid qui sont levés :
    1 : on reçois une chaîne vide.
    2 : on reçois une chaîne : (chemin d’accès au fichier & >ECHO OFF)
    3 : on reçois les 73 tirets en une seule fois. (-------------------------------------------)

    le fichier .bat simule tés bien Remuxtool.

  19. #19
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Un prog en mode console qui emet les - pour test (sans la chaine parasite du bat ECHO OFF)
    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
    Module Module1
        Dim UnTimer As New System.Timers.Timer
        Dim LeNombre As Integer = 0
        Sub Main()
            UnTimer.Interval = 1000
            AddHandler UnTimer.Elapsed, AddressOf tick
            UnTimer.Start()
            Console.Read() ' ou Console.ReadLine()
        End Sub
        Private Sub tick(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
            Console.Write("-")
            LeNombre += 1
            If LeNombre > 72 Then
                UnTimer.Stop()
                'System.Windows.Forms.SendKeys.SendWait("{ENTER}")
                Environment.Exit(0)
            End If
        End Sub
    End Module
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  20. #20
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci beaucoup rv26t, j'ai enfin pu obtenir les caractères au fur et à mesure qu'il s'affiche. Et grâce à ACTIVE_CS le .bat est super pratique pour faire des tests en condition presque réel. On avance
    Sinon merci beaucoup mais la chaîne parasite ne me gène pas, Remuxtool génère aussi d'autre chaines que je vais devoir filtrer de toute façon pour ne garder que la ligne correspondant à la progression.

    Voici le code que j'ai mis en place pour faire des tests (j'ai ajouté une feuille CancelForm comme indiqué dans l'exemple donné par rv26t) :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            ExecuteSimuRemuxtool()
        End Sub
     
        Private Sub ExecuteSimuRemuxtool()
            Dim CommandeLine As String
     
            CommandeLine = ""
            Call ShellExecute2("SimuRemuxtool.bat", CommandeLine)
        End Sub
     
        Dim WinStop As CancelForm
        Dim MonProcess As Process
        Private Sub ShellExecute2(ByVal ExeFile As String, CommandLine As String)
            Dim exitCode As Integer
     
            ' affichage de la fenêtre d'arrêt
            winStop = New CancelForm()
     
            ' on crée le thread de lecture des infos
            Dim readInfo As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf Me.readOutput))
     
            MonProcess = New Process
            AddHandler MonProcess.OutputDataReceived, AddressOf OutputDataReceived
            AddHandler MonProcess.ErrorDataReceived, AddressOf ErrorDataReceived
            AddHandler MonProcess.Exited, AddressOf Me.MonProcessEnded
     
            'MonProcess.SynchronizingObject = Me
            MonProcess.EnableRaisingEvents = True
     
            MonProcess.StartInfo.FileName = ExeFile
            MonProcess.StartInfo.Arguments = CommandLine
            'MonProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized
            MonProcess.StartInfo.CreateNoWindow = True        ' True
            MonProcess.StartInfo.UseShellExecute = False      ' False
            MonProcess.StartInfo.RedirectStandardOutput = True
            MonProcess.StartInfo.RedirectStandardInput = True
            MonProcess.StartInfo.RedirectStandardError = True
     
            MonProcess.Start()
     
            '''''''' MonProcess.BeginOutputReadLine()
            '''''''' MonProcess.BeginErrorReadLine()
     
             ' on démarre le thread de lecture
            readInfo.Start()
     
            ' on affiche la fenêtre de dialogue
            WinStop.ShowDialog()
     
            ' On vérifie si le processus est fini.
            ' Si ce n'est pas le cas, l'utilisateur a appuyé sur stop
            ' et il faut fermer le processus. Le thread est fermé après l'arrêt 
            ' du processus
            If Not MonProcess.HasExited Then
                MonProcess.Kill()
                MonProcess.WaitForExit()
            End If
     
            ' Après le close, les infos sur le processus ne seront plus
            ' disponible. La mémoire allouée pour conserver ces infos
            ' est rendue disponible
            exitCode = MonProcess.ExitCode
            MonProcess.Close()
            'Return exitCode
     
         End Sub
     
        Private Sub MonProcessEnded(sender As Object, e As System.EventArgs)
            'winStop.Close()
        End Sub
     
        Private Sub readOutput()
            Dim buffer As Char() = New Char(0) {}
            Dim car1 As Char = " "c
            Dim car2 As Char = " "c
            Dim car As Char = "%"c
            While Not MonProcess.HasExited
                MonProcess.StandardOutput.Read(buffer, 0, 1)
                Debug.Print(buffer)
                If buffer(0) = car Then
                    Debug.Print(Convert.ToString(car1) + Convert.ToString(car2) + "%")
                    WinStop.lblInfo.Text = Convert.ToString(car1) + Convert.ToString(car2) + "%"
                End If
                car1 = car2
                car2 = buffer(0)
            End While
        End Sub
    Dans Buffer je vois bien tous les caractères arriver les un par un. Mais il reste encore quelques soucis :
    - L'instruction winStop.Close() ne fonctionne pas à cause d'un accès inter-Threads interdit mais je pense que je n'aurais pas besoin de cette form.
    - Par contre le programme ne passe jamais dans le bloc If Buffer (0) = car, je ne comprends pas bien à quoi ça sert mais ça aurais interressant à cet endroit du programme de reconstituer la chaîne complète entre 2 retours à la ligne.

    Quelqu'un à une idée sur cette dernière partie du code ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/06/2013, 13h39
  2. Récupérer le message de sortie d'une procédure stockée
    Par akkeri dans le forum Développement
    Réponses: 2
    Dernier message: 10/03/2009, 07h45
  3. [VB6] Récupérer chaque lettre d'un String
    Par DJBORIE dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 28/03/2006, 17h28
  4. récupérer chaque ligne d'une requête ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 10/11/2005, 09h15
  5. Changer chaque caractère d'une chaîne
    Par YanK dans le forum Langage
    Réponses: 13
    Dernier message: 08/07/2005, 19h01

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