C#WinformでAndroidのようなListenerを実現

5962 ワード

この例では、C#がWinformを用いてAndroidのようなListenerを実現する方法について説明します.非常に実用的なテクニックです.具体的な実現方法は以下の通りである.
まずICallBackListenerインタフェースで、Listenが必要な方法を書きます.次に、ワーククラスに似たControllerクラスで、具体的な機能はここで実現できます.
実装コードは次のとおりです.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Listener
{
  /// 
  ///     (  Listener)
  /// 
  public interface ICallBackListener
  {
    void onCallBack();
    bool onCallBack(string pWhat);
  }

  /// 
  ///     ,    
  /// 
  public class Controller
  {
    //        
    private Thread mThread;

    //             Flag
    private bool mFlagWhile;
    private bool mFlagDoWork;

    //     Listener      (Android  vector)
    private List mListenerList;

    public Controller()
    {
      //    Listener  
      mListenerList = new List();

      //        
      mThread = new Thread(work);
      mFlagWhile = true;
      mFlagDoWork = true;
    }

    /// 
    ///        
    /// 
    private void work()
    {
      while (mFlagWhile)
      {
        Thread.Sleep(3000);
        if (mFlagDoWork)
        {
          //        
          //            
          ActiveOnCallBack();
        }
        Thread.Sleep(3000);
        if (mFlagDoWork)
        {
          //        
          //            
          ActiveOnCallBack("Test");
        }
      }
    }
    /// 
    ///   Controller  
    /// 
    public void Start()
    {
      if (mFlagWhile)
        mThread.Start();
    }

    /// 
    ///   Controller  
    /// 
    public void Stop()
    {
      mFlagWhile = false;
      mFlagDoWork = false;
      mThread.Abort();
    }

    /// 
    ///   onCallBack()
    /// 
    private void ActiveOnCallBack()
    {
      if(mListenerList!=null)
        foreach (ICallBackListener tCallBack in mListenerList)
        {
          tCallBack.onCallBack();
        }
    }
    /// 
    ///   onCallBack(string)
    /// 
    ///      
    private void ActiveOnCallBack(string pWhat)
    {
      if (mListenerList != null)
        foreach (ICallBackListener tCallBack in mListenerList)
        {
          tCallBack.onCallBack(pWhat);
        }
    }
    /// 
    ///   Listener
    /// 
    ///   ICallbackListener    
    public void setOnListener(ICallBackListener pCallBackListener)
    {
      if (pCallBackListener != null)
        mListenerList.Add(pCallBackListener);
    }
    /// 
    ///   Listener
    /// 
    ///   ICallbackListener    
    public void removeOnListener(ICallBackListener pCallBackListener)
    {
      if (pCallBackListener != null)
        mListenerList.Remove(pCallBackListener);
    }
  }
}


次に、このクラスをどのように使用するか、簡単にWinformを作成し、Buttonを停止し、TextBoxを印刷します.具体的な使い方にはコメントが!みんなが理解しやすい.
コードは次のとおりです.

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

namespace EventTest
{
  // Form     ICallBackListener      
  public partial class FormTest : Form, ICallBackListener
  {
    // UI    
    private delegate void DelegateTextBox(string pString);

    //    
    private Controller mController;

    public FormTest()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      //       ,    ,   
      mController = new Controller();
      mController.setOnListener(this);
      mController.Start();
    }

    // Override     
    public void onCallBack()
    {
      //       
      if (InvokeRequired)
      {
        textBox1.Invoke(new DelegateTextBox(pushTextInTextbox), new object[] { null });
      }
    }

    // Override     
    public bool onCallBack(string pWhat)
    {
      //       
      if (InvokeRequired)
      {
        textBox1.Invoke(new DelegateTextBox(pushTextInTextbox), new object[] { pWhat });
      }
      return false;
    }

    private void button1_Click(object sender, EventArgs e)
    {
      //      
      mController.Stop();
    }

    /// 
    ///        ,     Invoke  UI
    /// 
    ///    string  
    private void pushTextInTextbox(string pText)
    {
      if (pText != null)
      {
        textBox1.Text += "
:" + pText; } else { textBox1.Text += "
!"; } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { mController.Stop(); } } }

本明細書で述べた例は、C#プログラム設計に役立つことを期待します.