Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 03.02.2016
Сообщений: 2
.NET 3.x

Работа с асинхронным выводом консольного приложения (строковые переменные)

04.02.2016, 01:50. Показов 805. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для начала скажу, что в програмировании полный нуб - просто, иногда по работе без этого не обойтись... Поэтому прошу, по возможности, максимально разжевывать все куски кода и заранее выражаю благодарнсть за помощь.

Теперь к проблеме:
Есть форма, через которую при помощи стороннего консольного приложения (plink) открывается SSH-сессия и передается набор команд. При этом ввод и вывод перенаправляются в текстовое поле.

Вот пример, на основе которого составлена моя форма (взято https://www.cyberforum.ru/csharp-net/thread122667.html#post690376):

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
 
namespace console
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        delegate void UpdateConsoleWindowDelegate(String msg);
 
        Process console = null;
        StreamWriter consoleStreamWriter = null;
 
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
 
        }
 
 
 
        private void ConsoleOutputHandler(object sendingProcess,
    DataReceivedEventArgs recieved)
        {
            if (!String.IsNullOrEmpty(recieved.Data))
            {
 
                UpdateConsoleWindow(context + "\r\n");
                
            }
        }
 
        private void UpdateConsoleWindow(String message)
        {
            if (textBox1.InvokeRequired)
            {
                UpdateConsoleWindowDelegate update = new UpdateConsoleWindowDelegate(UpdateConsoleWindow);
                textBox1.Invoke(update, message);
            }
            else
            {
                textBox1.AppendText(message);
 
            }
        }
 
 
        private void button2_Click(object sender, EventArgs e)
        {
            if (!console.HasExited)
            {
                foreach (Process p in System.Diagnostics.Process.GetProcessesByName("mpcs_client"))
                {
                    try
                    {
                        p.Kill();
                        p.WaitForExit();
                    }
                    catch (Win32Exception winException)
                    {
                    }
                    catch (InvalidOperationException invalidException)
                    {
                    }
                }
 
                button1.Enabled = true;
                button2.Enabled = false;
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            console = new Process();
            console.StartInfo.FileName = "mpcs_client.exe";
            console.StartInfo.UseShellExecute = false;
            console.StartInfo.CreateNoWindow = true;
            console.StartInfo.RedirectStandardInput = true;
            console.StartInfo.RedirectStandardOutput = true;
            console.OutputDataReceived += new DataReceivedEventHandler(ConsoleOutputHandler);
            console.Start();
            consoleStreamWriter = console.StandardInput;
            console.BeginOutputReadLine();
            button1.Enabled = false;
            button2.Enabled = true;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            
        }
 
    }
}
Как видно из кода, вывод считывается в виде строковой переменной "message", с которой мне и нужно дальше работать.

Задача такова.
Для начала мне нужно выделить первую "message", содержащую значение "x" (это достаточно просто: "if (message.Contains(x)").
А вот дальше, собственно, не могу понять, как реализовать следующий сценарий: когда подходящая "message" найдена, возможны два варианта - а) следующая "message" тоже содержит значение "x" и б) следующая "message" тоже не содержит значение "x".
В случае а) мне необходимо скопировать из первой "message" значение "y" в текстовое поле и прекратить поиск, а в случае б) искать дальше до совпадения двух, следующих друг за другом строк, по значению "x" и (по аналогии) скопировать значение "y" из первой из них в текстовое поле. Также важно, чтобы учитывалось только первое совпадение.

Скопировать значение "y" я могу и сам, но над проблемой, как поставить одну "message" в строгую зависимость от другой и после первого совпадения прекратить совпадения искать, бьюсь уже почти неделю...

Так что, еще раз заранее спасибо за помощь!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2016, 01:50
Ответы с готовыми решениями:

Подключение к Access из консольного приложения MVS2012 и выборка данных c выводом в консоль
Пусть есть таблица TestDB c единственной таблицей Table_1 с двумя полями: ключевым текстовым полем key и числовым полем data. Задача...

Работа с файлами из консольного приложения
Есть две задачи которые требуют работать с файлами, а опыт работы с файлами из приложения у меня очень слабый. Задача 1: "Файл...

Странная работа консольного приложения
Здравствуйте! Проблема такая: Есть хорошее консольное приложение. Дома работает хорошо и стабильно. По окончании расчетов пишет - для...

2
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
04.02.2016, 11:30
wolk_tambowskij, Что вам мешает создать список List<string> messages (как поле формы) и заносить туда все пришедшие сообщения?
А затем после вновь пришедшего сообщения делать проверку:
C#
1
2
3
4
5
6
if(messages.Count > 1 &&
   messages[messages.Count - 1].Contains("x") &&
   messages[messages.Count - 2].Contains("x"))
{
 //....
}
0
0 / 0 / 1
Регистрация: 03.02.2016
Сообщений: 2
04.02.2016, 20:28  [ТС]
Спасибо, но это я уже пробовал - результат: "cannot convert string to int"

Добавлено через 7 часов 31 минуту
Storm23, все-таки получилось (синтаксис был неверный):
C#
1
2
var messages = new List<string>();
messages.Add(message);
А дальше, как в Вашем примере.
Вот, только каждая "message" почему-то приравнивается к "messages[messages.Count - 1]" - соответственно, при наличии параметра "messages.Count > 1" получается 0 совпадений...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2016, 20:28
Помогаю со студенческими работами здесь

Работа с классами и формами из консольного приложения
Стоит задача - определить из консольного приложения разрешение экрана. Учитывая что приложение консольное, часть классов, обычных для...

Работа с Access 2007 из консольного приложения
Есть задумка поработать с существующей БД из консольного приложения. На странице:...

Работа с выводом данных из другого приложения
Как вывести данные на экран из другого приложения? У меня есть главное activity приложения, куда я хочу вывести погоду на сегодня и на...

строковые переменные
помогите прошу... разработать алгоритм и программу для решения задачи с использованием строк символов. Дана строка символов....

Строковые переменные
Допустим есть код #include &lt;iostream&gt; main() { int x; cout&lt;&lt;&quot;Введите x&quot;; cin&gt;&gt;x; cout&lt;&lt;x; return 0; ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru