Как записать вывод консоли в элемент управления в многопоточном MVC смоделированном приложении? - PullRequest
0 голосов
/ 20 января 2020

Я нашел очень простой и элегантный способ направить вывод консоли в текстовое поле по этой ссылке , но сейчас я не нахожу способ реализовать его в своем классе докладчика, чтобы он работал везде, где я нужно это. Это означает, что в основном потоке, но также и во всех классах, инициированных в основном потоке.

Проблема в том, что класс, который я нашел в Интернете, имеет элемент управления (текстовое поле), в который направляется вывод. В моем классе докладчика я не могу определить элементы управления. Поэтому, когда я запускаю поток докладчика, который затем запускает форму, в которой я определил TextWriter, выходные данные, сгенерированные в форме, записываются в текстовое поле, как и ожидалось, но всякий раз, когда я Console.Writeline в презентаторе или в других случаях, созданных в докладчик, то он все еще направляется в стандартное окно вывода отладки ...

Я относительно новичок в модели MVC, как вы уже могли видеть. :)

Итак, TextBoxStreamWriter:

public class TextBoxStreamWriter : TextWriter
{
    TextBox _output ;

    public TextBoxStreamWriter(TextBox output)
    {
        _output = output;
    }

    public override void Write(char value)
    {
        MethodInvoker action = 
            delegate 
            {
                _output.AppendText(value.ToString());
            };
        _output.BeginInvoke(action);
    }

    public override Encoding Encoding
    {
        get { return System.Text.Encoding.UTF8; }
    }
}

В моем классе докладчика:

public MTMainPresenter(IMTMainForm view)
{
  _view = view;
  HandleShizzle();
  Console.Writeline("Presenter initialized :( "); // << Doesn't work as I want it to...
}

program.cs:

private static MTMainPresenter _presenter;

static void Main()
{
  var mainForm = new MTMainForm();
  _presenter = new MTMainPresenter(mainForm);
  Application.Run(mainForm);
}

В моем form:

TextWriter _writer = null;

private void Form1_Load(object sender, EventArgs e)
{
  _writer = new TextBoxStreamWriter(txtboxConsole);
  Console.SetOut(_writer);
  Console.Writeline("Yay !"); // << Works fine, the way I want it to
}

Итак, я создал тестовую кнопку в форме, которая сгенерировала Console.WriteLine (), и это работает просто отлично. Но когда я делаю то же самое в моем докладчике, он пишет в стандартное окно отладки. Я уже пытался инициализировать TextWriter в классе Procgram.cs, но так как он имеет элемент управления TextBox, который должен быть назначен, я немного растерялся, как решить эту проблему ...

Я Я уверен, что это так легко исправить, но мне не хватает опыта.

Заранее большое спасибо P

1 Ответ

0 голосов
/ 26 января 2020

Я понял. Подумав некоторое время и попробовав некоторые вещи, я нашел способ сделать это. Вероятно, будет намного лучший способ, поэтому, пожалуйста, исправьте меня, если это не соответствует передовым методам. :) Но это работает ...

Теперь я могу вызывать Console.WriteLine () где угодно (MTMainForm, Presenter, любые экземпляры пользовательских объектов внутри моего презентатора ...).

Шаги I делаю ... 1. Создать форму 2. В форме создайте модуль записи, связанный с элементом управления 3. Вернитесь в Program.cs, получите созданный модуль записи из формы 4. Отнесите вывод в модуль записи 5. Запустите форма ...

Program.cs

static void Main()
{
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);

     var mainForm = new MTMainForm();
     TextWriter wrt = mainForm.GetWriter();
     Console.SetOut(wrt);

     _presenter = new MTMainPresenter(mainForm);

     Application.Run(mainForm);
}

MTMainForm:

TextBoxStreamWriter _writer = null;

public MTMainForm()
{
    InitializeComponent();
    _writer = new TextBoxStreamWriter(textBoxConsole);
}

public TextBoxStreamWriter GetWriter()
{
    return _writer;
}

TextBoxStreamWriter:

public class TextBoxStreamWriter : TextWriter
{
    TextBox _output;

    public TextBoxStreamWriter(TextBox output)
    {
        _output = output;
    }

    public override void Write(char value)
    {
        MethodInvoker action =
            delegate
            {
                _output.AppendText(value.ToString());
                if (_output.Text.Length > 4000)
                    _output.Text = _output.Text.Substring(2000, _output.Text.Length - 2000);
            };
        _output.BeginInvoke(action);
    }

    public override Encoding Encoding
    {
        get { return System.Text.Encoding.UTF8; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...