none
TraceListenerをフォームに渡す RRS feed

  • 質問

  • おせわになります。

    通信ログの処理で、あまり考えずにListBoxに書かせていましたが、TraceListenerを見つけました。

    Trace.Listeners.Add()を使用して、ファイルやコンソールに書かす事ができるようですが、フォームのListBoxに

    データを渡すことは可能でしょうか?

    できれば、クラスを作成し、LogWrite(Listbox1,"内容",ログレベル)など可能でしょうか?

    2010年8月6日 2:02

回答

  • >TraceListener

     

    ちなみに、わざわざTraceListenerを継承したログクラスを作らずとも、

    以下のような感じで出来ませんか?

     

    // 各スレッドからのログ出力を呼び出すイメージ
    private void SampleThread()
    {
    	ListBoxWriter("Log Message.", TraceLevel.Info);
    }
    
    // ログ出力メソッドをInvoke呼び出しするメソッド
    private void ListBoxWriter(string message, TraceLevel tl)
    {
    	ListBoxWriterDelegate d = new ListBoxWriterDelegate(UIListBoxWriter);
    	this.Invoke(d, new object[] { message, tl });
    }
    
    // ListBoxログ出力用のデリゲート
    delegate void ListBoxWriterDelegate(string hoge, TraceLevel tl);
    
    // Invokeで呼び出されるメソッド
    public void UIListBoxWriter(string message, TraceLevel tl)
    {
    	lock (this.listBox1)
    	{
    		this.listBox1.Items.Add(message);
    		if (this.listBox1.Items.Count > 50) this.listBox1.Items.RemoveAt(0);
    	}
    }
    
    

    • 回答としてマーク metal_socket 2010年8月6日 5:46
    2010年8月6日 4:19

すべての返信

  • TraceListenerはスレッドセーフですので、マルチスレッドからの操作でも安全に利用できます。

    http://msdn.microsoft.com/ja-jp/library/hy72797k(v=VS.80).aspx


    >フォームのListBoxにデータを渡すことは可能でしょうか?

    TraceListenerクラスを継承した独自のクラスを定義することで可能と思われます。

    以下参考になりますでしょうか。

    http://japan.internet.com/developer/20051018/26.html

    2010年8月6日 2:31
  • >TraceListener

     

    ちなみに、わざわざTraceListenerを継承したログクラスを作らずとも、

    以下のような感じで出来ませんか?

     

    // 各スレッドからのログ出力を呼び出すイメージ
    private void SampleThread()
    {
    	ListBoxWriter("Log Message.", TraceLevel.Info);
    }
    
    // ログ出力メソッドをInvoke呼び出しするメソッド
    private void ListBoxWriter(string message, TraceLevel tl)
    {
    	ListBoxWriterDelegate d = new ListBoxWriterDelegate(UIListBoxWriter);
    	this.Invoke(d, new object[] { message, tl });
    }
    
    // ListBoxログ出力用のデリゲート
    delegate void ListBoxWriterDelegate(string hoge, TraceLevel tl);
    
    // Invokeで呼び出されるメソッド
    public void UIListBoxWriter(string message, TraceLevel tl)
    {
    	lock (this.listBox1)
    	{
    		this.listBox1.Items.Add(message);
    		if (this.listBox1.Items.Count > 50) this.listBox1.Items.RemoveAt(0);
    	}
    }
    
    

    • 回答としてマーク metal_socket 2010年8月6日 5:46
    2010年8月6日 4:19
  • honefai殿

    ありがとうございました。

    頂いたサンプルで機能しました。これをクラス化し、再利用できる様考えます。

    また、質問させて頂きます。

     

    2010年8月6日 5:20