Process input/output

haicon
Дата: 09.06.2014 17:19:16
Добрый день.

Необходимо запустить процесс с выводом и вводом данных. Есть бат файл который формирует вспомогательные файлы для запуска exe файла. И потом в данном bat файле запускает exe файл(стороннее приложение) с параметрами сформированных файлов. Exe файл выполняет компиляцию данных с выводом в консоль определенных данных. Я перехватываю вывод этих данных и вывожу у себя в приложении. Но бывают случаи когда компиляция в exe прекращается по ошибке (не находит устройство) и выводит сообщение о с просьбой прекратить или попробывать еще раз найти данное устройство. Так вот почемуто в мое приложение не до конца попадает сообщение и я никак не могу понять как мне перехватить ввод.

Если бат файл запусти cmd то получаю корретное сообщение и запрос на ввод
Проверка аппаратного устройства
Не найден сервер аппаратного устройства!
Проверьте, запущен ли этот сервер!
[b]Продолжить поиск аппаратного устройства? [ Y-да N-нет ] :[/b]

А у меня процесс подвисает в таком состоянии
Проверка аппаратного устройства
Не найден сервер аппаратного устройства!
Проверьте, запущен ли этот сервер!


т.е. не выводит последнюю строку с запросом.


Вот мой код. Что я не так делаю ?
 class Program
    {
        static void Main()
        {
               Runner run = new Runner();
               run.OnOnputDataReceived += run_OnOnputDataReceived;
               run.OnExited += run_OnExited;
               run.OnErrorDataReceived += run_OnErrorDataReceived;
               run.Run();
               run.Close();

              Console.ReadKey();
        }

        static void run_OnExited(object sender, EventArgs e)
        {
            Console.WriteLine("EXIT PROCESS");
        }

        static void run_OnErrorDataReceived(object sender, EventArgs e)
        {
            Console.WriteLine(string.Format("EXIT Error: {0}", ((DataReceivedEventArgs)e).Data));
        }

        static void run_OnOnputDataReceived(object sender, EventArgs e)
        {
            Console.WriteLine(((DataReceivedEventArgs)e).Data);
        }
    }

   public class Runner
    {
        Process p;

        public Runner()
        { }

        public void Run()
        {
            Process[] processList = Process.GetProcessesByName("vip");

            foreach (Process pp in processList)
            {
                pp.Kill();
            }


            p = new Process();

            p.StartInfo.UseShellExecute = false;
            p.StartInfo.FileName = @"D:\App\RunApp.bat";
            p.StartInfo.CreateNoWindow = false;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.WorkingDirectory = @"G:\App";
            p.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866);
            p.StartInfo.ErrorDialog = true;
            p.EnableRaisingEvents = true;

            p.Exited += RunProcess_Exited;
            p.ErrorDataReceived += p_ErrorDataReceived;            
            p.OutputDataReceived += p_OutputDataReceived;
           
            p.Start();            

            p.BeginOutputReadLine();
            p.BeginErrorReadLine();

            p.WaitForExit();
            
            Console.WriteLine(p.ExitCode);
        }

        public event EventHandler OnErrorDataReceived;

        void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (OnErrorDataReceived != null)
            {
                OnErrorDataReceived(sender, e);
            }
        }

        public event EventHandler OnExited;

        void RunProcess_Exited(object sender, EventArgs e)
        {
            if (OnExited != null)
            {
                OnExited(sender, e);
            }
        }

        public event EventHandler OnOnputDataReceived;

        void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Data))
            {
                if (OnOnputDataReceived != null)
                {
                    OnOnputDataReceived(sender, e);
                }
            }

        }

        public void Close()
        {
            p.Close();
        }
    }


В общем мне нужно как-то получать интерактивный вывод и при необнодимости ввода данных произвести данный ввод.
D129
Дата: 09.06.2014 17:58:12
haicon

В общем мне нужно как-то получать интерактивный вывод и при необнодимости ввода данных произвести данный ввод.


Видимо диалоговая строка не закончена, и не выбрасывается в поток....
Если не найдется решения - определяйте об останове по таймауту и последнему полученному сообщению. Оно ведь всегда "Проверьте, запущен ли этот сервер!"
?
haicon
Дата: 09.06.2014 19:15:54
D129
haicon
В общем мне нужно как-то получать интерактивный вывод и при необнодимости ввода данных произвести данный ввод.


Видимо диалоговая строка не закончена, и не выбрасывается в поток....
Если не найдется решения - определяйте об останове по таймауту и последнему полученному сообщению. Оно ведь всегда "Проверьте, запущен ли этот сервер!"
?


Посути диологовое сообщение завершено. Т.к. если завершить процесс (сторонней программы), то строка все же выдается. По таймауту тоже думал проэто, но как это не красиво выглядит...
D129
Дата: 10.06.2014 09:56:52
haicon
но как это не красиво выглядит...

Весь интернет так работает.
Чего в этом некрасивого?
Если у вас нет никаких активных способов проверить, остановилось приложение или нет - то время ожидания, полученное опытным путем, вполне способ.