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

Windows Forms Discussion :

[C#] Redirection d'input et output


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 54
    Points : 36
    Points
    36
    Par défaut [C#] Redirection d'input et output
    hello,

    J'ai une appli qui lance un process (un script Perl) dont j'aimerais capturer la sortie et rediriger l'entrée.
    Le problème c'est que faire les 2 je n'y arrive pas. Si le script ne demande pas d'entrée, l'output est bien redirigé. S'il n'y pas d'output l'entrée est bien redirigée et je peux la controler depuis mon appli .NET. Mais si le process écrit sur l'output puis attend une entrée, alors rien ne se passe, le flux d'output n'est pas redirigé. Et ça m'emmerde bien puisque ce que je veux lui passer en entrée dépend de la sortie.
    Quelqu'un sait-il comment faire, svp ?

    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
    class Program
        {
            static void Main(string[] args)
            {//configurer le process et le lancer
                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.StartInfo.FileName = "perl.exe";
                proc.StartInfo.Arguments = "test.pl";//"install Crypt-SSLeay/Crypt-SSLeay-0.51.ppd";
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.RedirectStandardInput = true;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.Start();
     
                System.IO.StreamWriter Writer = proc.StandardInput;
     
                String outputText;
     
                while (!proc.HasExited)
                {
                    //input si la ligne de sortie finit par '?'
                    outputText = proc.StandardOutput.ReadLine();
                    Console.WriteLine(outputText);
                    if (outputText[outputText.Length - 1] == '?')
                    {
                        Writer.WriteLine("yes.txt");
                        Writer.Flush();
                    }
                }
                Writer.Close();
                proc.Close();
                Console.ReadKey();
            }
        }

  2. #2
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 114
    Points : 86
    Points
    86
    Par défaut bonjour
    salut
    desolé C pas claire

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Comment ça c'est pas clair ?

    J'ai une appli qui appelle un process dont je veut rediriger les entrées/sorties.

    -Si le process n'a que des entrées, elles sont redirigées vers mon appli sans problème.

    -S'il n'a que des sorties, elles sont redirigées vers mon appli sans problème

    -Síl contient des entrées et des sorties, impossible de rediriger les sorties. C'est là le problème, comment gérer les 2 à la fois. Je ne sais même pas pourquoi ça ne fonctionne pas quand les 2 flux sont utilisés.

    C'est mieux ?

  4. #4
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 114
    Points : 86
    Points
    86
    Par défaut
    desolé mais tu parle de koi quand tu veux dire des entres/sorties
    si C'estdes dans ce cas tu utilise response.redirect("")

  5. #5
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Si je comprends bien, ton script Perl affiche en sortie des infos, puis attend une entrée de l'utilisateur, puis en fonction de ça affiche une autre sortie, etc...
    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > blablablablablablablablablablablablablablablablablablablablabla
    > Combien de fois le mot tada voulez-vous ? : <ici il attend une valeur, genre 4>
    > tada tada tada tada
    C'est ça ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    Voila, c'est exactement ça.
    entrée: lecture sur l'entrée standard,
    sortie: ecriture sur la sortie standard.

    Je suis en train de faire une bidouille de manière asynchrone (beginRead) avec handler d'evenements, mais ça coince toujours.

  7. #7
    Provisoirement toléré
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2005
    Messages : 114
    Points : 86
    Points
    86
    Par défaut aie aie
    aie aie bon je crois que je me plantais des le debut C pas garve C la participation qui compte desolé bleuarff

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 54
    Points : 36
    Points
    36
    Par défaut
    J'y arrive vraiment pas et je commence à desesperer. Pourquoi ce code ne fonctionne pas ? Tout ce qu'il fait c'est envoyer une entrée quand il capture et reconnait une sortie. Mais là il bloque sur le while, comme s'il ne capturait plus rien en sortie...help !

    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
    public partial class Form1 : Form
        {
            private String output;
            private Boolean boo;
     
            public Form1()
            {
                InitializeComponent();
                boo = false;
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.StartInfo.FileName = "perl.exe";
                proc.StartInfo.Arguments = "test.pl";//"install Crypt-SSLeay/Crypt-SSLeay-0.51.ppd";
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.CreateNoWindow = true;
                proc.StartInfo.RedirectStandardInput = true;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.RedirectStandardError = true;
     
                proc.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
                proc.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);
     
                proc.Start();
     
                proc.BeginErrorReadLine();
                proc.BeginOutputReadLine();
                StreamWriter writer = proc.StandardInput;
                writer.AutoFlush = true;
                int i = 0;
                while (!proc.HasExited)
                {
                    if (boo)
                    {
                       writer.WriteLine(output);
                        boo = false;
                    }
                }
                writer.Close();
                proc.CancelErrorRead();
                proc.CancelOutputRead();
                proc.Close();
     
               // Application.Exit();
            }
     
            private void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
            {
                boo = true;
                output = outLine.Data;
                if (!String.IsNullOrEmpty(outLine.Data))
                {
                    if (outLine.Data[outLine.Data.Length - 1] == '?')
                    {
                        output = "coin.txt";
                    }
                    else if (outLine.Data.IndexOf("[yes]") != -1)
                    {
                        output = "yes";
                    }
                    else if (outLine.Data.IndexOf("[no]") != -1)
                    {
                        output = "no";
                    }
                }
            }
    }

Discussions similaires

  1. Input process output
    Par bobyboby dans le forum Design Patterns
    Réponses: 1
    Dernier message: 04/01/2011, 17h55
  2. console application avec input et output
    Par kaiser92 dans le forum Visual C++
    Réponses: 2
    Dernier message: 08/02/2010, 20h39
  3. Pin PFI en input ou output ?
    Par Pierre13Th dans le forum LabVIEW
    Réponses: 1
    Dernier message: 05/08/2008, 14h29
  4. Réponses: 0
    Dernier message: 17/07/2008, 10h17

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