C#でのスレッド対応コードのサンプル

なにかと,スレッドのサンプルコード,必要なんですわなぁ~
あちこち散らばったプロジェクトから,あ~でもないこ~でもないと,抜き出すのが,だんだん面倒になったんで
スケルトンを書いておきますです

勝手に持っていっちゃってくださいませぇ~~♥

なお,こやつ,インスタンスを作れば,スレッドが作成され
待機状態へ

Start()メソッドで,処理本体が起動しますです…

なお,このサンプルでは,2スレッド起動されます

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading; 
using System.Windows.Forms;

namespace bMountLibrary
{
	public class ClassThreadSample
	{
		#region クラス
		public class ThreadJobFixArg : EventArgs
		{
			private int  m_ThreadNo;
			private int  m_FixCount;
			public int ThreadNo { get { return m_ThreadNo;} set { m_ThreadNo = value;}}
			public int FixCount { get { return m_FixCount;} set { m_FixCount = value;}}
			public ThreadJobFixArg(int tmpNo, int tmpFixCount)
			{
				m_ThreadNo = tmpNo;
				m_FixCount = tmpFixCount;
			}
		}

		public class ThreadLoopEndArg : EventArgs
		{
			private int  m_ThreadNo;
			public int ThreadNo { get { return m_ThreadNo;}}
			public ThreadLoopEndArg(int tmpNo){	m_ThreadNo = tmpNo;}
		}
		#endregion

		#region イベント
		public delegate void OnThreadJobFix(object o, ThreadJobFixArg e);
		public delegate void OnThreadLoopEnd(object o, ThreadLoopEndArg e);
		public event OnThreadJobFix				OnThreadJobFixEvent;			//スレッド処理中向けイベント
		public event OnThreadLoopEnd			OnThreadLoopEndEvent;			//スレッドループアウト伝達向けイベント
		#endregion


        private bool m_ThreadOnFL;				//スレッドループを生かしている間はTrue
        private bool m_ThreadJob1FL;			//スレッド処理を開始する場合はTrue
        private bool m_ThreadJob2FL;
        private Thread m_Thread1;
        private Thread m_Thread2;

        //---------------------------------------------
        //コンストラクタ
        //
        //---------------------------------------------
		public ClassThreadSample()
		{
			OnThreadJobFixEvent = null;
			OnThreadLoopEndEvent = null;
            m_Thread1 = new Thread(new ThreadStart(ThreadMethod1)); 
            m_Thread2 = new Thread(new ThreadStart(ThreadMethod2)); 
            m_Thread1.Name = "サンプルスレッド_Loop1";
            m_Thread2.Name = "サンプルスレッド_Loop2";
			m_Thread1.Start();
			m_Thread2.Start();
		}

        //---------------------------------------------
        //リソースの開放
        //
        //---------------------------------------------
        public void Dispose()
        {
            #region
            m_ThreadOnFL = false;
            for(int i = 0; i < 200; i++)		//スレッドが死ぬまで最大200ミリ秒待たしてみる
            {
                if ((m_Thread1 == null) && (m_Thread2 == null))
                {
                    break;
                }

                Application.DoEvents();
                Thread.Sleep(1);
            }

            #endregion

        }
        //---------------------------------------------
        //スレッド処理の開始
        //
        //---------------------------------------------
        public void Start()
        {
            #region
            m_ThreadJob1FL = true;			//スレッド処理を開始するときはTrueにする
            m_ThreadJob2FL = true;
            #endregion
        }

        //---------------------------------------------
        //スレッドによるデータ再編成処理主処理(1)
        //
        //---------------------------------------------
        private void ThreadMethod1()
        {
            #region
            while (m_ThreadOnFL == true)
            {
                if (m_ThreadJob1FL == false)		//フラグがfalse時は待機させる
                {
                    Thread.Sleep(1);
                    continue;
                }

				//------------------------------------------
				//ここいらにお好きな処理を書いてくださいませ
				//------------------------------------------

				m_ThreadJob1FL = false;			//処理が終わったら待機動作へもどすとか?

				if (OnThreadJobFixEvent != null)		//1処理完了したら,イベントを飛ばしてみたり
				{
					OnThreadJobFixEvent(this, new ThreadJobFixArg(1, 0));
				}
            }

			if (OnThreadLoopEndEvent != null)			//スレッドループを抜けたら,イベントを飛ばしてみたり
			{
				OnThreadLoopEndEvent(this, new ThreadLoopEndArg(1));
			}

            m_Thread1 = null;
            #endregion
        }

        //---------------------------------------------
        //スレッドによるデータ再編成処理主処理(2)
        //
        //---------------------------------------------
        private void ThreadMethod2()
        {
            #region
            while (m_ThreadOnFL == true)
            {
                if (m_ThreadJob2FL == false)
                {
                    Thread.Sleep(1);
                    continue;
                }

				//------------------------------------------
				//ここいらにお好きな処理を書いてくださいませ
				//------------------------------------------

				m_ThreadJob2FL = false;			//処理が終わったら待機動作へもどすとか?

				if (OnThreadJobFixEvent != null)
				{
					OnThreadJobFixEvent(this, new ThreadJobFixArg(2, 0));
				}
            }

			if (OnThreadLoopEndEvent != null)
			{
				OnThreadLoopEndEvent(this, new ThreadLoopEndArg(2));
			}

            m_Thread2 = null;
            #endregion
        }


	}
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください