2011-08-04 18 views
6

私はいくつかの画面にいくつかのデータクエリを作成しており、時間がかかることがあります。私のdbレイヤーはすでにクエリ文字列をコンソールに配置しています(デバッグ時に出力ウィンドウに表示されます)。私はちょうど彼らが目障りに成長する場合、ユーザーが同じことを見るために開くことができるウィンドウを持っていたい。winformsでは、コンソール出力を表示するウィンドウを作る最も簡単な方法は何ですか?

すばやくこれを行うための提案はありますか?

答えて

5

あなたがStringWriterのインスタンスにConsole.Outをリダイレクトする場合は、あなたがコンソールに書き込まれているテキストを取得することができます:あなたは新しいForm以内にこれを行う場合は、あなたがしてポーリングすることができ

StringWriter writer = new StringWriter(); 
Console.SetOut(writer); 
StringBuilder consoleOut = writer.GetStringBuilder(); 
string text = consoleOut.ToString(); 

をこれまでのところコンソールに書き込まれたテキストを取得し、その値をTextBoxに入れるために間隔をおいて。粗製の例:

public MyForm() 
{ 
    InitializeComponent(); 

    StringWriter writer = new StringWriter(); 
    Console.SetOut(writer); 

    Timer timer = new Timer(); 
    timer.Tick += (o, s) => textBox.Text = writer.GetStringBuilder().ToString(); 
    timer.Interval = 500; 
    timer.Start(); 
} 

に注意すべきいくつかのこと:

  • StringWriterは使い捨てなので、現実にはそのDispose()方法はありませんが、技術的に、あなたは(行われたときに、それを処分する必要があります何もそれほど大きな問題ではない)。
  • StringWriterは、それまでに書き込まれたすべてのテキストを含む内部StringBuilderを保持します。これは時間の経過とともに大きくなるので、アプリケーションが長く実行されるほど、消費するメモリは増えます。特定のサイズに達すると定期的にチェックを入れることができます。
  • 間隔を狭すぎると、CPUが常に使用されます。
  • フォームを閉じるときにConsole.Outを元の値に戻してください。そうしないと、メッセージをコンソールに再度印刷できなくなります。
+0

詳細な回答をいただきありがとうございます。私はそれを撃つだろう。 –

+0

私はまだstringbuilderのメモリの問題を修正していませんが、基本的には動作します。本当にありがとう。私はここから大丈夫になるはずです。 –

+0

優秀な回答btw。 –

0

DebugView

のDebugViewを使用すると、ローカルシステム、またはあなたはTCP/IP経由で到達可能なネットワーク上の任意のコンピュータ上でデバッグ出力を監視することができますアプリケーションです。カーネルモードとWin32デバッグ出力の両方を表示できるため、アプリケーションやデバイスドライバが生成するデバッグ出力をデバッガで捕捉する必要はなく、非標準デバッグを使用するようにアプリケーションやドライバを変更する必要もありません出力API。

+0

DbgViewはコンソール出力をキャプチャせず、デバッグとトレースのみをキャプチャします。また、自分のアプリケーション内にコンソール出力を表示することもできません。 – adrianbanks

+0

OPは出力がどのように生成されるのかを言わなかったし、彼は外部ツールに気にしなかったと思った。しかし、私はDbgViewがコンソール出力をデバッグとトレースだけで表示しないことに同意します。 –

関連する問題