Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
4 / 4 / 4
Регистрация: 08.04.2008
Сообщений: 85
.NET 4.x

Перенаправление вывода консольного приложения в WinForm

03.01.2017, 18:39. Показов 2270. Ответов 14

Студворк — интернет-сервис помощи студентам
Добрый день!
Имеется программа AVRDude. Консольный вариант. Делаю перенаправление вывода с этого консольного приложения в WinForm. Все проде бы получилось, но есть одно но. В AVRDUDE_PROG(GUI) для AVRDude сделано так, что в GUI, как я понимаю, поток данных передается на лету. А не потом отображается все что было выполнено. Получается, что в AVRDUDE_PROG весь процесс работы можно видеть в реальном времени. Если же делать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            textBox5.Text = "";
            Process AvrDude = new Process();
            AvrDude.StartInfo = new ProcessStartInfo();
            AvrDude.StartInfo.WorkingDirectory = ExePath + "/avrdude63";
            AvrDude.StartInfo.FileName = "cmd.exe";
            AvrDude.StartInfo.Arguments = @"/c avrdude.exe -p t24 -c usbasp -P usb -U flash:w:flash.hex:a";
            AvrDude.StartInfo.CreateNoWindow = true;
            AvrDude.StartInfo.ErrorDialog = true;
            AvrDude.StartInfo.RedirectStandardError = true;
            AvrDude.StartInfo.UseShellExecute = false;
            AvrDude.Start();
            Encoding cp866 = Encoding.GetEncoding("cp866");
            AvrDude.StartInfo.StandardErrorEncoding = cp866;
            textBox5.AppendText(AvrDude.StandardError.ReadToEnd());
            AvrDude.Close();
то никакого выполнения в реальном времени нет. Данные приходят в winform уже после работы консольного AVRDude.
Как организовать перенаправления данных в форму сразу же после их появления в консоли? Надеюсь, что понятно объяснил. Чего то аж сам запутался.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.01.2017, 18:39
Ответы с готовыми решениями:

Не удаётся перенаправить потоки вывода буферного консольного приложения
Доброго времени суток. Стоит задача: Есть программа, которая запускает консольное приложение с какими-то аргументами, чем-то с ним...

Запуск стороннего консольного приложения и доступ к его потокам ввода/вывода
Здравствуйте! Есть java прилажение, работающее в консоли (сервер Minecraft'а). Я хочу запустить его на сервере (Windows Server 2003) как...

Как преобразовать код консольного приложения в WinForm
Есть код консольного приложения для отображения информации о видео карте ManagementObjectSearcher searcher11 = new...

14
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
04.01.2017, 15:03
White Wolf, здесь нужно использовать асинхронное чтение из перенаправлямого потока используя метод Process.BeginErrorReadLine() и событие Process..ErrorDataReceived. Небольшая трудность заключается в том что после вызова BeginErrorReadLine нужно обязательно вызывать WaitForExit что означает блокировку вызываемого потока и значит работу с процессом нужно вынести в отдельный поток. Следующая трудность заключается в том обновлять форму прямо из обработчика события ErrorDataReceived скорее всего плохая идея т.к. частые обновления подвесят UI. Поэтому обработчику лучше только накапливать данные, а выводить их можно по таймеру. В итоге мы получаем примерно такой код:
Кликните здесь для просмотра всего текста
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
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        System.Windows.Forms.Timer _timer;
        StringBuilder _sb = new StringBuilder();
        volatile bool _done;
 
        private void button1_Click(object sender, EventArgs e)
        {
            _done = false;
 
            _timer = new System.Windows.Forms.Timer();
            _timer.Tick += Timer_Tick;
            // Интервал должен быть достаточно большим чтобы не подвешивать форму постоянными обновлениями
            _timer.Interval = 800;
            _timer.Enabled = true;
 
            Thread procThread = new Thread(RunAvrDude);
            procThread.Start();
        }
 
        private void Timer_Tick(object sender, EventArgs e)
        {
            string text;
            lock (_sb)
            {
                text = _sb.ToString();
                _sb.Clear();
            }
            if (text.Length > 0)
            {
                textBox1.AppendText(text);
            }
 
            if (_done)
            {
                _timer.Enabled = false;
                _timer.Tick -= Timer_Tick;
                _timer.Dispose();
                _timer = null;
            }
        }
 
        void RunAvrDude()
        {
            try
            {
                using (Process AvrDude = new Process())
                {
                    AvrDude.StartInfo = new ProcessStartInfo
                    {
                        FileName = "cmd.exe",
                        Arguments = @"/c avrdude.exe -p t24 -c usbasp -P usb -U flash:w:flash.hex:a",
                        WorkingDirectory = ExePath + "/avrdude63",
                        CreateNoWindow = true,
                        ErrorDialog = true,
                        RedirectStandardError = true,
                        StandardErrorEncoding = Encoding.GetEncoding("cp866"),
                        UseShellExecute = false
                    };
                    AvrDude.ErrorDataReceived += RedirectedDataRecevied;
                    AvrDude.Start();
                    AvrDude.BeginErrorReadLine();
                    AvrDude.WaitForExit();
 
                    AvrDude.ErrorDataReceived -= RedirectedDataRecevied;
                }
            }
            finally
            {
                _done = true;
            }
        }
 
        void RedirectedDataRecevied(object sender, DataReceivedEventArgs args)
        {
            if (args.Data == null) return;
            lock (_sb)
            {
                _sb.AppendLine(args.Data);
            }
        }
    }

P.S. Зачем ты запускаешь cmd, а не непосредственно приложение? Это же лишние траты системных ресурсов. В рамках вышеприведенного примера заменяем строки №56,57 на
C#
1
2
                        FileName = "avrdude.exe",
                        Arguments = "-p t24 -c usbasp -P usb -U flash:w:flash.hex:a",
2
4 / 4 / 4
Регистрация: 08.04.2008
Сообщений: 85
04.01.2017, 18:21  [ТС]
Как проверю, отпишусь.
0
4 / 4 / 4
Регистрация: 08.04.2008
Сообщений: 85
08.01.2017, 21:56  [ТС]
Проверил. Работает все.
Но у меня остался вопрос. В оригинальном AVRDude сделан прогресс бар, который заполняется до 100% постепенно и это все видно на экране. А таким способом менее 100 мс уже не посмотришь вывод. Разницы никакой что 10мс, что 50, что 100 мс. А как это сделано? И можно ли сделать так же? Если не понятно объяснил, приложу видео.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
08.01.2017, 22:05
White Wolf, с ходу ответить не могу. Для начала надо смотреть что выводится при перехвате вывода.

Цитата Сообщение от White Wolf Посмотреть сообщение
А таким способом менее 100 мс уже не посмотришь вывод. Разницы никакой что 10мс, что 50, что 100 мс.
Откуда здесь миллисекунды появились?
0
4 / 4 / 4
Регистрация: 08.04.2008
Сообщений: 85
09.01.2017, 04:56  [ТС]
Ну, это я уже поэкспериментировал с вашими
C#
1
_timer.Interval = 800;
Ставил разные интервалы. В принципе, у меня и при 50мс интерфейс не вешается. Я пока оставил 100.
Спасибо и за подсказку убрать cmd.exe из кода. Я чего-то не додумался сам.
А маленькие значения таймера я пробовал ставить из-за того, что время прошивки контроллера в AVRDude у меня 0,45s. Хотел посмотреть, увижу я как заполняется прогресс бар или нет. Не увидел.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
09.01.2017, 11:23
White Wolf, возможно что прогресс вообще не выводится при перенаправленном выводе.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.01.2017, 11:29
White Wolf, на Дуду исходники открыты. Посмотрите как и куда там выводится прогресс.
0
4 / 4 / 4
Регистрация: 08.04.2008
Сообщений: 85
09.01.2017, 15:09  [ТС]
aquaMakc,в консольной дудке прогресс бар есть. Его видно. В GUI к нему AVRDUDE_PROG прогресс бар тоже есть и работает. А я вот не могу понять как его организовали в GUI. В какую хоть сторону копать.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
09.01.2017, 15:10
White Wolf, ну так я и говорю - смотри исходники.
0
4 / 4 / 4
Регистрация: 08.04.2008
Сообщений: 85
09.01.2017, 15:11  [ТС]
OwenGlendower,прогресс бар выводится. В GUI к нему AVRDUDE_PROG он есть и работает. Как вот только это сделано не пойму.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
09.01.2017, 15:26
White Wolf, как уже правильно отметил aquaMakc надо смотреть исходники.
0
4 / 4 / 4
Регистрация: 08.04.2008
Сообщений: 85
09.01.2017, 15:31  [ТС]
OwenGlendower,к AVRDUDE_PROG (GUI) нет исходников. А для консольной версии (avrdude.exe) мне зачем исходники? Я вас не понимаю.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18244 / 14158 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
09.01.2017, 15:46
White Wolf, чтобы посмотреть не отключается ли вывод прогресса при перенаправленном выводе и возможно понять как GUI приложение его получает.

Еще идея появилась - посмотри с какими параметрами GUI приложение запускает консольное. Это удобно делать через Process Explorer.
0
4 / 4 / 4
Регистрация: 08.04.2008
Сообщений: 85
09.01.2017, 18:07  [ТС]
OwenGlendower,завтра на работе попробую. Я USBAsp на работу унес.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2017, 18:07
Помогаю со студенческими работами здесь

Как преобразовать код консольного приложения в WinForm или Класс
Есть приложение для работы в сети написанное в консольном приложении. делает отправку и приём данных в непрерывном режиме. работает со...

обработка вывода консольного приложения
Доброго времени суток! Возможно подобная тема уже была, но все же задам вопрос по конкретной задаче. Есть исполняемый файл...

Перенаправление вывода из java-приложения в c#
Здравствуйте. Есть клиент-серверное java-приложение (виртуальная файловая система). Клиент - консольное приложение, которое управляет...

Перевод консольного приложения в winform
Добрый день попробывал пример из https://www.cyberforum.ru/kip-sensors/thread1079562.html , понравился но мне нужен графический интерфейс. ...

Перенос из консольного приложения в winform
Добрый день, переношу консольное приложение в в вин форм. Проблема возникла со статическими полями. В консольном приложении имеется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru