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 :

MS dos redirigé en temps réel vers un textbox


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 35
    Points
    35
    Par défaut MS dos redirigé en temps réel vers un textbox
    Bonjour,
    J'essaye de récupérer le résultat d'une fenêtre ms dos dans un simple textbox.
    Cela fonctionne mais pas en temps réel.

    L'output de ms dos est bien redirigé vers le textbox.
    Si le résultat d'un ping par exemple met 6 secondes en dos. Je dois attendre 6 secondes pour voir apparaître l'entièreté sur le textbox. J'aimerais bien que tout soit synchronisé en temps réel.

    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
        Sub _command_netsh(ByVal _context As String, ByVal _command As String, ByVal _argument_1 As String, ByVal text_box_name As TextBox)
            Dim _command_string_builder As New StringBuilder(_context & _command & Chr(34) & _argument_1 & Chr(34))
            Dim my_network_process As New Process()
            my_network_process.EnableRaisingEvents = True
            With my_network_process.StartInfo
                .Arguments = _command_string_builder.ToString()
                .FileName = "netsh.exe" '"hypertrm.exe" '"tracert.exe"
                .UseShellExecute = False
                .CreateNoWindow = True
                .RedirectStandardOutput = True
                .StandardOutputEncoding = Encoding.GetEncoding(863) '(850) '("iso-8859-1")
            End With
     
     
            AddHandler my_network_process.OutputDataReceived, AddressOf p_OutputDataReceived
     
            my_network_process.Start()
            'text_box_name.Text = my_network_process.StandardOutput.ReadToEnd
            'text_box_name.Text = my_network_process.StandardOutput.ReadLine()
            my_network_process.BeginOutputReadLine()
            my_network_process.WaitForExit()
     
     
        End Sub
     
        Private Sub p_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
            If e.Data IsNot Nothing Then
                TextBox1.Text += (e.Data.ToString) + Chr(13)
            End If
        End Sub
    J'ai essayé cette ligne aussi qui n'affiche que le début du ping. Mais ce n'est sûrement pas la solution à mon problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_network_process.WaitForExit(2000)
    Pour utiliser mon code j'ai dressé une liste de commandes utiles dans un dropdownlist qui s'appelle diag_connectivite et l'output msdos dans textbox1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Protected Sub diag_connectivite_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles diag_connectivite.SelectedIndexChanged
     
            _command_netsh("diag ", diag_connectivite.SelectedValue, "", TextBox1)
     
        End Sub
    Vous pouvez remplacer diag_connectivite.SelectedValue par "ping loopback" si vous voulez tester mon code.

    Avez-vous des idées pour que mon textbox se remplisse petit à petit ?

    PS : Je ne veux pas utiliser l'objet ping reply car je perdrais l'intérêt des commandes que l'on peut passer en MS-DOS

    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Le problème, c'est le WaitForExit : cet appel est bloquant, et comme il s'exécute sur le thread de l'interface graphique, l'affichage ne se rafraichit pas avant le retour de WaitForExit, donc la fin du process.

    Si tu as besoin de faire quelque chose de particulier à la fin du processus, abonne-toi plutôt à l'évènement Exited du process, et n'appelle pas WaitForExit.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 35
    Points
    35
    Par défaut
    J’ai supprimé la ligne avec waitforexit()
    J’ai rajouté quelques lignes dans ma fonction _command_netsh

    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
            AddHandler my_network_process.OutputDataReceived, AddressOf p_OutputDataReceived
            AddHandler my_network_process.Exited, AddressOf p_Exited
            my_network_process.Start()
            'text_box_name.Text = my_network_process.StandardOutput.ReadToEnd
            'text_box_name.Text = my_network_process.StandardOutput.ReadLine()
     
            Dim delais_d_affichage As Integer = 1000 '1 seconde
            Dim cpt_raffraichissement As Integer = 0
            Dim nbr_raffraichissement As Integer = 4
     
            Do While cpt_raffraichissement < nbr_raffraichissement
                my_network_process.BeginOutputReadLine()
                Threading.Thread.Sleep(delais_d_affichage)
     
                my_network_process.CancelOutputRead()
                my_network_process.Close()
                cpt_raffraichissement = cpt_raffraichissement + 1
            Loop
    Maintenant, j’obtiens un résultat sur le textbox au bout de 4 secondes.
    J’aurais aimé voir un résultat sur le textbox toutes les secondes. Mais comment faire ?
    Malgré le my_network_process.close() je n’atteins pas l’événement p_Exited.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
            TextBox1.Text += (e.ToString) + Chr(13)
    J'ai écrit ce code dans une page aspx.vb => J'espère que ça n'a pas d'influence négative sur le rafraichissement du textbox
    L'autopostback est mis sur true pour le textbox et le dropdownlist.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Icewall Voir le message
    Maintenant, j’obtiens un résultat sur le textbox au bout de 4 secondes.
    J’aurais aimé voir un résultat sur le textbox toutes les secondes. Mais comment faire ?
    Toujours le même problème, ta fonction boucle jusqu'à ce que ce soit fini, et ne rend jamais la main au thread principal, donc l'interface ne se met pas à jour.

    Citation Envoyé par Icewall Voir le message
    Malgré le my_network_process.close() je n’atteins pas l’événement p_Exited.
    La méthode Close ne termine pas le process, elle ferme le handle du process. Ne l'utilise pas à moins d'avoir fini de travailler avec ce process

    Citation Envoyé par Icewall Voir le message
    J'ai écrit ce code dans une page aspx.vb => J'espère que ça n'a pas d'influence négative sur le rafraichissement du textbox
    L'autopostback est mis sur true pour le textbox et le dropdownlist.
    Euh... jusqu'ici j'avais supposé que c'était du WinForms, ça change tout !
    Dans ton cas, il n'y a qu'un seul postback, et le résultat revient au client seulement après la fin du traitement. Si tu veux rafraichir en temps réel, il faut faire le traitement dans un autre thread, et que le client rappelle périodiquement le serveur en AJAX pour voir où ça en est. Le plus simple c'est sans doute de mettre la textbox dans un UpdatePanel avec un timer, ça t'évitera de te taper du javascript.

    Par contre, côté serveur, pour gérer les différents process en cours entre 2 postbacks, c'est un peu plus coton...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 35
    Points
    35
    Par défaut
    Je laisse tomber mon idée première de créer mon projet en asp car je me vois mal taper du javascript.

    J'ai recréé un projet winforms avec le même code. J'ai déjà cette erreur :
    Opération inter-threads non valide : le contrôle 'my_textbox' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    C'est quand même bizarre en asp, je n'avais aucun message d'erreur...


    Les codes sur l'inter threading que j'ai lu sur le net sont beaucoup trop long pour que je puisse les comprendre. Bref, j'en reviens encore et toujours à mon problème de threading.

    Tomlev as tu quelques sources sur ce sujet ? Je suis encore novice en cette matière malheureusement.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Icewall Voir le message
    C'est quand même bizarre en asp, je n'avais aucun message d'erreur...
    C'est pas bizarre, il n'y a quasiment rien de commun entre ASP.NET et WinForms...

    Citation Envoyé par Icewall Voir le message
    Les codes sur l'inter threading que j'ai lu sur le net sont beaucoup trop long pour que je puisse les comprendre. Bref, j'en reviens encore et toujours à mon problème de threading.

    Tomlev as tu quelques sources sur ce sujet ? Je suis encore novice en cette matière malheureusement.
    C'est tout bête en fait. Les contrôles de l'interface graphique ne peuvent être accédés qu'à partir du thread qui gère l'interface graphique. Si tu as besoin d'y accéder à partir d'un autre thread, il faut créer un délégate et l'appeler sur le thread de l'UI avec la méthode Invoke.

    Donc transformer ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void MaMethode()
    {
       // Du code...
     
       // Du code qui accède à l'UI...
     
       // Encore du code...
    }
    En ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void MaMethode()
    {
        // Du code...
     
        Action action = () =>
        {
            // Du code qui accède à l'UI...
        };
        this.Invoke(action);
     
        // Encore du code...
    }
    (au cas où tu ne connais pas les expressions lambda, cf. la FAQ)

    Par exemple, pour changer le texte d'une TextBox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void UpdateTextBox(string text)
    {
        Action action = () => textBox1.Text = text;
        this.Invoke(action);
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 35
    Points
    35
    Par défaut
    Merci pour tes explications Tomlev.

    J'ai amélioré mon projet (winforms) et je suis repassé en mode asynchrone pour des raisons de facilités. Je dois attendre quelques secondes pour voir un résultat sur mon textbox. Ce qui me laisse tu temps pour manger des popcorns avant de savoir si mes commandes ont réussi
    Le suspense est intense

    Je préfère avancer sur les autres fonctionnalités de mon projet. Je reviendrai à ce problème plus tard.

    J'ai rajouté une pièce jointe pour que tu vois ce que j'ai fait
    Label1 prend le nom de l'interface sur laquelle je veux travailler parmi le listview.
    Images attachées Images attachées  

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Avril 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Avril 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Carractére accentué de la fenetre DOS
    Bonjour,
    J'ai des problèmes de fonte MS DOS quand je récupère le texte dans une Textbox, les caractères accentués n'apparaissent pas correctement.
    Je vois dans ton image que tu n'as pas ce problème.
    Comment fait tu ?
    Merci.

  9. #9
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Là, tu parles de l'encodage de ton fichier texte. Cela devrait pouvoir se régler avec la classe Encoding et une des surcharges de ta méthode de lecture de tes fichiers. Mais là Caiguisé n'est pas spécialité.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

Discussions similaires

  1. Capteurs 3D en temps réel vers smartphone
    Par guilem72 dans le forum Embarqué
    Réponses: 3
    Dernier message: 08/06/2015, 08h46
  2. Réponses: 3
    Dernier message: 27/06/2012, 13h49
  3. Réponses: 4
    Dernier message: 30/12/2011, 21h26
  4. Réponses: 1
    Dernier message: 19/03/2011, 23h24
  5. Durée d'un traitement temps réel
    Par Almex dans le forum C
    Réponses: 5
    Dernier message: 29/03/2003, 14h15

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