2010-08-02 3 views
2

В приложении C# .NET GUI. Мне также нужна консоль в фоновом режиме для некоторых задач. В принципе, я использую библиотеку Thrid Party для некоторой обработки (занимает много времени), которая записывает промежуточные результаты на консоль. Эта обработка является вычислительной задачей времени. Итак, я назначаю эту задачу для фонового рабочего. Я имею в виду, что фоновый работник называет эти библиотечные функции. Но проблема в том, что у меня нет способа показать статус пользователя вычисления, потому что у меня нет источника библиотеки. Я надеялся, что консоль будет показана. Но неудивительно, что Console.WriteLine не работает. Я имею в виду, что консольное окно не отображается. Как так?Console.Write в приложении .NET GUI

EDIT:

Я попытался установить тип приложения = консоли. Но, похоже, проблема. Только основной поток может получить доступ к консоли. На консоли отображаются только Console.WriteLine s, исполненные основной (прикладной) нитью. Console.WriteLine s, выполненный другими (BackgroundWorker) потоками графического интерфейса, выход не отображается. Мне нужна консоль только для фоновых работников. Я имею в виду, когда начальный рабочий стол запускается, консоль запускает &, когда он заканчивается, консоль отключается.

+0

Это полная противоположность тому, что вы хотите: как скрыть окно консоли: http://stackoverflow.com/questions/2160338/how-to-hide-console-after-creating-form-in-console- application – claws

ответ

2

Создайте собственное окно консоли и используйте Console.SetOut (myTextWriter); способ читать что-либо написанное на консоль.

+0

Ну, как я могу использовать это, если я не тот, кто пишет для консоли? Я сказал, что стороннее приложение пишет на консоль, и у меня нет источника для этого. – pecker

+0

Если сторонняя библиотека является сборкой .NET и использует 'Console.Out', это позволит вам захватывать все, что она печатает, и отображать ее в вашем собственном окне. Если это родная DLL, которую вы p/invoke, 'Console.SetOut' не будет эффективной. –

1

Задайте тип приложения «Консольное приложение». Консольные приложения также могут создавать окна графического интерфейса без проблем и одновременно записывать на консоль.

Если у вас нет контроля над основным приложением, и вы хотите убедиться, что консоль показана, вы можете p/invoke AllocConsole (signature here).

Это не то же самое, что быть консольным приложением, хотя ваше приложение всегда будет иметь отдельное окно консоли, что может быть удивительно для того, кто запустил его из окна командной строки. Вы можете обойти это с помощью AttachConsole (s ignature and example here), но перенаправление оболочки на выходе все равно не будет работать. Вот почему я предлагаю настроить консоль приложения на консоль, если сможете.

+1

Это удивительно! Теперь возникает вопрос: «Как Console & GUI Applications отличаются?».До сих пор я думал, что класс приложения GUI наследуется от приложений Form и Console. Есть ли что-то еще? – pecker

+0

Класс приложения GUI не наследуется от 'Form'. В приложении GUI ваша основная функция создает экземпляр некоторого класса, полученного из 'Form', и вызывает' Application.Run' (для WinForms, другая, но аналогичная функция для WPF). Вы также можете вызывать 'Application.Run' из консольной программы, и он будет показывать графический интерфейс вместе с консольным окном. –

+0

Вот объяснение, которое также показывает, что программу GUI можно отметить как консольную программу ПОСЛЕ того, как это сделано: http://www.codeproject.com/KB/cpp/EditBin.aspx –

0

Последующий @jgauffin, вот реализация метода Console.SetOut.

Создайте унаследованный класс TextWriter.

using System; 
using System.Text; 
using System.IO; 
using System.Windows.Forms; 

namespace ConsoleRedirection 
{ 
    public class TextBoxStreamWriter : TextWriter 
    { 
     TextBox _output = null; 

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

     public override void Write(char value) 
     { 
      base.Write(value); 
      _output.AppendText(value.ToString()); // When character data is written, append it to the text box. 
     } 

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

И в форме, как показано ниже.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace ConsoleRedirection 
{ 
    public partial class FormConsole : Form 
    { 
     // That's our custom TextWriter class 
     TextWriter _writer = null; 

     public FormConsole() 
     { 
      InitializeComponent(); 
     } 

     private void FormConsole_Load(object sender, EventArgs e) 
     { 
      // Instantiate the writer 
      _writer = new TextBoxStreamWriter(txtConsole); 
      // Redirect the out Console stream 
      Console.SetOut(_writer); 

      Console.WriteLine("Now redirecting output to the text box"); 
     } 

     // This is called when the "Say Hello" button is clicked 
     private void txtSayHello_Click(object sender, EventArgs e) 
     { 
      // Writing to the Console now causes the text to be displayed in the text box. 
      Console.WriteLine("Hello world"); 
     } 
    } 
} 

Оригинальный код из https://saezndaree.wordpress.com/2009/03/29/how-to-redirect-the-consoles-output-to-a-textbox-in-c/ Вы можете проверить ссылку на кросс-нить вызовов и передовые реализации в комментариях.

Смежные вопросы