powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Process input/output
4 сообщений из 4, страница 1 из 1
Process input/output
    #38665549
haicon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

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

Если бат файл запусти cmd то получаю корретное сообщение и запрос на ввод
Код: c#
1.
2.
3.
4.
Проверка аппаратного устройства
Не найден сервер аппаратного устройства!
Проверьте, запущен ли этот сервер!
Продолжить поиск аппаратного устройства? [ Y-да N-нет ] :


А у меня процесс подвисает в таком состоянии
Код: c#
1.
2.
3.
Проверка аппаратного устройства
Не найден сервер аппаратного устройства!
Проверьте, запущен ли этот сервер!



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


Вот мой код. Что я не так делаю ?
Код: c#
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.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
 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();
        }
    }



В общем мне нужно как-то получать интерактивный вывод и при необнодимости ввода данных произвести данный ввод.
...
Рейтинг: 0 / 0
Process input/output
    #38665586
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
haicon
В общем мне нужно как-то получать интерактивный вывод и при необнодимости ввода данных произвести данный ввод.

Видимо диалоговая строка не закончена, и не выбрасывается в поток....
Если не найдется решения - определяйте об останове по таймауту и последнему полученному сообщению. Оно ведь всегда "Проверьте, запущен ли этот сервер!"
?
...
Рейтинг: 0 / 0
Process input/output
    #38665655
haicon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129haiconВ общем мне нужно как-то получать интерактивный вывод и при необнодимости ввода данных произвести данный ввод.

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

Посути диологовое сообщение завершено. Т.к. если завершить процесс (сторонней программы), то строка все же выдается. По таймауту тоже думал проэто, но как это не красиво выглядит...
...
Рейтинг: 0 / 0
Process input/output
    #38665949
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
haicon но как это не красиво выглядит...
Весь интернет так работает.
Чего в этом некрасивого?
Если у вас нет никаких активных способов проверить, остановилось приложение или нет - то время ожидания, полученное опытным путем, вполне способ.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Process input/output
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]