Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для Adler_lug
0 / 0 / 0
Регистрация: 14.04.2015
Сообщений: 14

Получение в реальном времени возврата от консольного приложения с использованием WaitForExit();

28.07.2016, 11:09. Показов 2328. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вроде и тема уже изъезженная и вдоль и поперек, но что то не могу дать ладу уже два вечера.
Есть функция:
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
private bool wimlib(string cmd, string file, string param = "")
        {
            bool res;
            try
            {
               
                    string wlib_exe = "";
                    wlib_exe = Environment.CurrentDirectory + "\\wimlib-imagex.exe"; 
                    
                Process wlib = new Process();
                wlib.StartInfo.FileName = wlib_exe;
                string arguments = cmd + " "" + @file + "" " + param;
                wlib.StartInfo.Arguments = arguments;
                wlib.StartInfo.UseShellExecute = false;
                wlib.StartInfo.CreateNoWindow = true;
                wlib.StartInfo.RedirectStandardOutput = true;
                wlib.StartInfo.RedirectStandardError = true;
 
                wlib.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866);
 
                wlib.OutputDataReceived += new DataReceivedEventHandler(wlib_result);
                wlib.ErrorDataReceived += new DataReceivedEventHandler(wlib_result);
            
                wlib.EnableRaisingEvents = true;
                wlib.Exited += new EventHandler(wlib_exit);
                wlib.Start();
               
                wlib.BeginOutputReadLine();
                wlib.BeginErrorReadLine();
                wlib.WaitForExit();
                
                res = true;
                return res;
            }
            catch (Exception error)
            {
                res = false;
                MessageBox.Show("Error starting!\n" + error.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return res;
            }
        }
И есть соответствующий wlib_result():
C#
1
2
3
4
5
6
7
8
9
10
private void wlib_result(object sender, DataReceivedEventArgs e)
        {
            BeginInvoke(new MethodInvoker(delegate
            {
                  if (!String.IsNullOrEmpty(e.Data))
                  {
                      textBox1.AppendText(e.Data + Environment.NewLine);
                  }
              })); 
        }
Функция wimlib() вызывается функцией типа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void create()
{
//много кода
progressBar1.Minimum = 0;
            progressBar1.Maximum = f_image.GetLength(0) * 2;
            progressBar1.Value = 0;
            progressBar1.Step = 1;
 
for (int p = 0; p < f_image.GetLength(0); p++) // f_image.GetLength(0) может быть от 1 до ~5-10
{
//тут генерятся значения p1, p2
wimlib("export", first_file, p1);
progressBar1.PerformStep();
 
wimlib("export", second_file, p2);
progressBar1.PerformStep();
}
textBox1.AppendText("Операция завершена.");
}
В процессе функция выполняется несколько минут и должна генерировать несколько сот строк "обратки".

create() в свою очередь вызывается функцией:
C#
1
2
3
4
5
private void button3_Click(object sender, EventArgs e)
{
//много кода
create();
}
Проблема в том, что возврат (несколько сот строк) в textBox1 я получаю вообще в конце окончания всего цикла (это около 5 минут) и после надписи "Операция завершена."
Не понятно почему вообще textBox1 заполяняется в конце цикла, а не после каждого запуска wimlib()?

Если убрать (для отладки) wlib.WaitForExit(); обратку получаю в реалтайме в виде какого то перемешанного бреда сразу от нескольких потоков. Само собой функция как полагается не работает, т.к. каждый вызов wimlib() должен происходить после завершения предыдущего вызова.

Тема достаточно истоптана вроде, но из всего найденного в гугле оно либо не работает, либо не разобрался как это применить.

Буду искренне благодарен за заведомо рабочий пример, который будет возвращать "обратку" построчно в реальном времени и что бы форма не "тупила" (весьма желательно, т.к. во время она хоть и не зависает совсем (progressBar заполняется), но окно нельзя переместить на рабочем столе и оно явно тормозит) пока происходит отработка функции wimlib().
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2016, 11:09
Ответы с готовыми решениями:

Перехват вывода консольного приложения в реальном времени
Всем доброго утра! Суть в чем: есть такое консольное приложение for($x=0; $x&lt;20; $x++) { print &quot;$x\n&quot;; sleep 1; } ...

Получение статистики в реальном времени
Добрый день. У меня есть табличка, в которую вносятся данные о поступивших файлах в некоторые папки. И мне нужно такую статистику выводить...

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

4
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.07.2016, 11:43
Лучший ответ Сообщение было отмечено Adler_lug как решение

Решение

Цитата Сообщение от Adler_lug Посмотреть сообщение
Проблема в том, что возврат (несколько сот строк) в textBox1 я получаю вообще в конце окончания всего цикла (это около 5 минут) и после надписи "Операция завершена."
Вы же блокируете основной поток вызовом метода wimlib.
В методе wimlib вы пытаетесь добавить текст в поле, что должно выполниться в основном потоке. Который заблокирован методом wimlib.

Исправить можно двумя простыми способами:
1. Выполнять цикл в отдельном потоке.
2. Переписать код под асинхронную модель

Первый вариант проще — достаточно вынести код цикла в BackgroundWorker.
1
 Аватар для Adler_lug
0 / 0 / 0
Регистрация: 14.04.2015
Сообщений: 14
28.07.2016, 14:50  [ТС]
kolorotur,
Досконально не тестировал, т.к. рабочее корыто уходит в ступок при работе wimlib-imagex.exe, но поместив содержимое create() в BackgroundWorker1DoWork() (create() удалил) и заменив вызов create() на backgroundWorker1.RunWorkerAsync() увидел при запуске в textBox1 активно бегущие строчки...

Добавлено через 27 минут
Только вот теперь перестал работать progressBar.

Я предварительно перенес это
C#
1
2
3
4
            progressBar1.Minimum = 0;
            progressBar1.Maximum = f_image.GetLength(0) * 2;
            progressBar1.Value = 0;
            progressBar1.Step = 1;
в button3_Click() , иначе она (в смысле вся функция) почему то не работала.
А как теперь заставить что бы progressBar работал (т.е. он должен двигаться на 1 после каждого вызова wimlib() из функции BackgroundWorker1DoWork())?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.07.2016, 15:11
Цитата Сообщение от Adler_lug Посмотреть сообщение
Только вот теперь перестал работать progressBar.
Обновляйте прогресс через вызов метода ReportProgress на вашем BackgroundWorker'e.
Предварительно установите свойство WorkerReportsProgress на true и подпишитесь на событие ProgressChanged. Всё это можно сделать в дизайнере, если вы добавили воркера через него.

В методе DoWork замените progressBar1.PerformStep() на backgroundWorker1.ReportProgress. А в обработчик события ProgressChanged добавьте progressBar1.PerformStep().
0
 Аватар для Adler_lug
0 / 0 / 0
Регистрация: 14.04.2015
Сообщений: 14
28.07.2016, 22:04  [ТС]
kolorotur, а можно в коде, а то что то не особо понял?

Добавлено через 6 часов 3 минуты
kolorotur, разобрался. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.07.2016, 22:04
Помогаю со студенческими работами здесь

sockets - получение данных в реальном времени?
Добрый день. Народ, объясните мне, как описать(какое выбрать) событие, чтоб получать данные с sockets в реальном времени, вот данные...

Получение содержимого Не своего сайта в реальном времени
Задача не из простых для меня. есть сайт. У меня допустим нету к нему доступа. Я захожу на страницу. Мне нужно не обновляя эту...

Получение карты глубины из Z буфера в реальном времени
Добрый день. Столкнулся с непростой задачей. Не могли бы подсказать реально ли вытащить карту глубины из Z буфера (depth buffer) в...

Получение данных из консольного приложения
Здравствуйте форумчане! Пожалуйста, подскажите . У меня такой вопрос. Я скачал примерчик из...

Обновление БД в реальном времени с использованием EF для архитектуры MVVM
Доброго времени суток. Возможно ли отображение всех изменений в БД в реальном времени? Например добавил я через другую программу строку в...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru