2010-08-02 2 views
2

C# .NET GUI 응용 프로그램의 경우. 또한 일부 작업을 위해 백그라운드에서 콘솔이 필요합니다. 기본적으로 Thrid Party 라이브러리를 사용하여 중급 결과를 콘솔에 기록하는 일부 처리 (많은 시간 소요)가 있습니다. 이 처리는 계산 시간의 작업입니다. 그래서 저는이 작업을 배경 작업자에게 할당 할 것입니다. 배경 작업자가 이러한 라이브러리 함수를 호출한다는 의미입니다. 그러나 문제는 라이브러리의 소스가 없기 때문에 계산의 사용자 상태를 표시 할 수있는 방법이 없다는 것입니다. 나는 콘솔이 보여 지길 바랬다. 그러나 놀랍게도 Console.WriteLine이 작동하지 않는 것 같습니다. 내 말은, 어떤 콘솔 창이 보이지 않는다는 것입니다. 어째서?.NET GUI 응용 프로그램의 Console.Write

편집 :

내가 응용 프로그램 유형 = 콘솔을 설정했습니다. 그러나 문제가있는 것 같습니다. 단, 메인 스레드는 콘솔에 액세스 할 수 있습니다. main (Application) 스레드에 의해 실행되는 Console.WriteLine 만 콘솔에 표시됩니다. Console.WriteLine이 GUI의 다른 (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'을 사용하는 경우 인쇄중인 내용을 가져 와서 자신의 창에 표시 할 수 있습니다. p/invoke하는 네이티브 DLL 인 경우,'Console.SetOut'는 유효하지 않습니다. –

1

응용 프로그램 유형을 "콘솔 응용 프로그램"으로 설정하십시오. 콘솔 응용 프로그램은 문제없이 GUI 창을 만들고 동시에 콘솔에 쓸 수 있습니다.

주 응용 프로그램을 제어 할 수없고 콘솔이 표시되도록하려면 AllocConsole (signature here)을 p/호출 할 수 있습니다.

이것은 콘솔 응용 프로그램과 같지 않습니다. 응용 프로그램은 항상 별도의 콘솔 창을 가지므로 명령 프롬프트 창에서 응용 프로그램을 시작한 사람이 놀랄 것입니다. AttachConsole (s ignature and example here)으로 해결할 수 있지만 출력의 셸 리디렉션이 작동하지 않습니다. 가능한 경우 응용 프로그램 하위 시스템을 콘솔로 설정하는 것이 좋습니다.

+1

이것은 놀랍습니다! 이제는 "콘솔과 GUI 응용 프로그램이 어떻게 다른가요?"라는 질문이 제기됩니다.지금까지 GUI 응용 프로그램 클래스는'Form' 및 Console 응용 프로그램에서 상속받은 클래스가 아니라고 생각했습니다. 이것에 더 많은 것이 있습니까? – pecker

+0

GUI 응용 프로그램 클래스는'Form'에서 상속받지 않습니다. GUI 응용 프로그램에서 main 함수는'Form'에서 파생 된 일부 클래스의 인스턴스를 만들고'Application.Run'을 호출합니다 (WinForms의 경우 WPF와는 다른 기능이지만 비슷한 기능). 콘솔 프로그램에서도'Application.Run'을 호출 할 수 있습니다. 그러면 콘솔 창 옆에 GUI가 나타납니다. –

+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/ 에서 당신은 코멘트에서 스레드 간 통화 및 고급 구현에 대한 링크를 확인할 수 있습니다.

관련 문제