Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2015, 11:17   #1
rusl31
 
Регистрация: 09.01.2012
Сообщений: 4
По умолчанию Перехват вывода консольного приложения

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

Код WinForms приложения:

Код:
Process _procPerl;
 
private void bStartProc_Click(object sender, EventArgs e)
{
    _procPerl = new Process();
    _procPerl.StartInfo.FileName = "perl.exe";
    _procPerl.StartInfo.UseShellExecute = false;
    _procPerl.StartInfo.RedirectStandardOutput = true;
    _procPerl.StartInfo.CreateNoWindow = true;
    _procPerl.StartInfo.Arguments = tbParams.Text;
    _procPerl.EnableRaisingEvents = true;
    _procPerl.Exited += _procPerl_Exited;
    _procPerl.OutputDataReceived += _procPerl_OutputDataReceived;
    if (_procPerl.Start())
    {
        _procPerl.BeginOutputReadLine();
        bStopProc.Enabled = true;
        bStartProc.Enabled = false;
    }
}
 
void _procPerl_Exited(object sender, EventArgs e)
{
    Action Exited = delegate() {
        bStopProc.Enabled = false;
        bStartProc.Enabled = true;
    };
    Invoke(Exited);
}
 
void _procPerl_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    Action<object> Received = delegate(object s) {
        if(s != null)
            tbOutput.AppendText(s.ToString() + Environment.NewLine); 
    };
    Invoke(Received, (object)e.Data);
}
 
private void bStopProc_Click(object sender, EventArgs e)
{
    if (_procPerl != null && !_procPerl.HasExited)
        _procPerl.Kill();
    bStopProc.Enabled = false;
    bStartProc.Enabled = true;
}
Проблема в том, что _procPerl_OutputDataReceived срабатывает только после завершения процесса _procPerl, а надо, чтобы срабатывало по мере реального вывода (чтобы выводило как в консоли, каждая строка через одну секунду, см. код Perl).
rusl31 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Захват вывода консольного приложения (avrdude.exe) RaJa Общие вопросы Delphi 4 19.03.2012 18:24
Перехват сообщения в Delphi консольного приложения. Never74 Общие вопросы Delphi 2 26.09.2011 19:55
Перехват строк из консольного приложения Slonnn Помощь студентам 6 08.04.2010 14:28
перехват консольного ввода\вывода Артем5555555 Win Api 14 28.10.2008 23:20
Перехват вывода консольного приложения Роман Радер Общие вопросы Delphi 0 12.02.2007 18:40