「<C#> マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」のコード No.6

                                                    <h2>*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*</h2>

C#
「マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」のコード No.6


*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

.






元のページ


元ページ「<C#> マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」

http://note.chiebukuro.yahoo.co.jp/detail/n165465

 

記述量上限の制限で、ページを分けて記述しています。





本ページの前のページ


「マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」のコード No.5
http://note.chiebukuro.yahoo.co.jp/detail/n170411

 

記述量上限の制限で、ページを分けて記述しています。






本ページの次のページ


「マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」のコード No.7
http://note.chiebukuro.yahoo.co.jp/detail/n170424

 

記述量上限の制限で、ページを分けて記述しています。








はじめに


元ページの「<C#> マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう」におけるコードをここに記述します。








要求電文処理受付クラスのコード




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


// マウスのドラッグで、キャラクター画像を移動させる画像処理を、マルチスレッドで行なう。
namespace DragThreadSimple1
{

    // ************************************
    // ************************************
    // 要求電文処理受付クラス
    //  本クラスは、画像処理の要求受付を行なうスレッドを管理します。ちなみに、
    //  本クラスは、受け付けを行なうだけであって、画像移動、ズーム等の実際の画
    //  像処理は行ないません。実際の画像処理は、別のクラスで行ない、本クラスは、
    //  そのクラスの機能を呼び出します。
    // ************************************
    // ************************************
    public partial class GraphicsAcceptanceThread
    {


        // ************************************************
        // スレッドの一時中断や強制終了などの機能
        // ************************************************


        // ==============
        // 接続要求受け入れ開始メソッド
        //  外部からの要求の受け付け処理を、本メソッドで開始する。
        public void AcceptanceStart()
        {

            // スレッド作成
            if (ListeningCallbackThread == null) // まだスレッドが生成されていない場合
            {

                // 接続待ち用スレッドを作成
                //  --- 対象処理用メソッドをスレッド用メソッドとして登録
                ListeningCallbackThread = new System.Threading.Thread(ListeningCallback);

            }


            // スレッドが終了している場合
            //  --- スレッドステータス(状態)が、
            //      「スレッド上に Thread.Start メソッドを呼び出していない」を示しているか、もしくは、
            //      「スレッドを停止している」を示している場合ではある場合
            if *1 != 0)
            {
                // このケースの場合(スレッドが終了の場合)は、本ボタン
                // の押下は、スレッドを開始させる指示を意味している。


                try
                {
                    // 接続待ち用スレッドを開始
                    ListeningCallbackThread.Start();
                }
                // Thread のStart()メソッドの呼び出しで、無効な ThreadState 列挙体(Thread の実行状態)のThread である場合
                catch (System.Threading.ThreadStateException ex)
                {
                    // 一度スレッド終了してから再スタートする。


                    // 接続要求受け入れ終了メソッド
                    _AcceptanceEnd_();

                    try
                    {
                        // 接続要求受け入れ開始メソッド
                        AcceptanceStart();
                    }
                    catch (System.Threading.ThreadStateException ex2)
                    {
                        // 2度目のエラーは、もう対処なし。
                    }

                }
                catch (Exception ex)
                {
                }


                // スレッド終了指示フラグを開始に設定して、要求の受信受付用
                // 無限ループを開始させる。
                SLTAlive = true;

            }

        }


        // ==============
        // 接続要求受け入れ終了メソッド < ログ情報伝達は有り >
        //  外部からの要求の受け付け処理を、本メソッドで終了する。
        public void AcceptanceEnd()
        {

            // 接続要求受け入れ終了メソッド < ログ情報伝達は無し >
            _AcceptanceEnd_();


            // ログ関連の情報伝達
            //  --- クラスオブジェクト生成後に登録されたメソッドを実行
            OnLogMessage("受付機能終了");

        }


        // ==============
        // 接続要求受け入れ終了メソッド < ログ情報伝達は無し >
        //  外部からの要求の受け付け処理を、本メソッドで終了する。
        //
        //    <終了通達イベントを発生させない理由>
        //      接続要求受け入れ終了メソッドには、終了通達用イベントを
        //      発生するタイプと、発生させないタイプの2種類のメソッド
        //      が用意されています。本メソッドは、後者の終了通達イベン
        //      トを発生させないタイプのほうです。なぜ、終了通達イベン
        //      トを発生させない終了メソッド(本メソッド)を用意する必
        //      要があるのかと言いますと、アプリケーションソフトを終了
        //      する時に、このメソッドが必要だからです。なお、アプリケ
        //      ーションソフトを終了する時は、受け付け用スレッドを終了
        //      させる必要があるので、本メソッドを実行します。ところで、
        //      スレッドが終了通達用メソッド(イベントプロシージャ)を
        //      呼び出したタイミングでアプリケーションソフトを終了する
        //      と、そのメソッドが処理し切れないで実行時エラーになるこ
        //      とがあります(すなわち、もう既に、該当メソッドの処理を
        //      実行し始めているのに、そのメソッドがアクセスするコント
        //      ロール等が破棄されている場合は、実行時エラーになる)。
        //      よって、アプリケーションソフト終了時に実行する接続要求
        //      受け入れ終了メソッドは、終了通達イベントを発生させない
        //      タイプの終了メソッドのほう(すなわち、本メソッドのほう
        //      )を使います。
        //
        //      上記の意味がよくわからない場合は、終了通達イベントを発
        //      生するタイプのほうを実際に使って見て下さい。数回に1度
        //      は、実行時エラーが発生します。
        public void _AcceptanceEnd_()
        {
            // まだスレッドが生成されていない場合
            if (ListeningCallbackThread == null)
            {
                SLTAlive = false;

                return;
            }


            // スレッドが既に実行されている場合
            //  --- スレッドステータス(状態)が、
            //      「スレッド上に Thread.Start メソッドを呼び出していない」を示しているか、もしくは、
            //      「スレッドを停止している」を示している場合ではない場合
            if *2 == 0)
            {

                // スレッドが中断されている場合
                //  --- スレッドステータス(状態)が、
                //      「スレッドが中断されている」を示しているか、もしくは、
                //      「スレッドの中断の要求処理が行なわれた」を示している場合である場合
                if *3 != 0)
                {
                    // 再開始
                    // (一時中断中のままで終了させるとエラーになるので再開始させる)
                    ListeningCallbackThread.Resume();
                }


                // スレッドを強制終了
                ListeningCallbackThread.Abort();


                // もうこのスレッドは使えないので null で初期化
                ListeningCallbackThread = null;


                // スレッド終了指示フラグを終了に設定して、要求の受信受付用
                // 無限ループを終了させる。
                SLTAlive = false;


                // キューからすべてのオブジェクトを削除します。
                ReceiveMessageQue.Clear();


                // ログ関連の情報伝達
                //  --- クラスオブジェクト生成後に登録されたメソッドを実行
                // *** OnLogMessage("受付機能終了");


                // *** ---> <削除>
                // ***      本メソッドは、< ログ情報伝達は無し >の仕様のため、
                // ***      上記処理をコメント化しました。

            }

        }

 

        // ==============
        // 接続要求受け入れ再開始メソッド
        //  外部からの要求の受け付けが中断されている場合、本メソッドで再開始する。
        public void AcceptanceRestart()
        {
            // まだスレッドが生成されていない場合
            if (ListeningCallbackThread == null)
            {
                return;
            }


            // スレッドが中断されている場合
            //  --- スレッドステータス(状態)が、
            //      「スレッドが中断されている」を示しているか、もしくは、
            //      「スレッドの中断の要求処理が行なわれた」を示している場合である場合
            if *4 != 0)
            {

                // 再開始
                ListeningCallbackThread.Resume();


                // ログ関連の情報伝達
                //  --- クラスオブジェクト生成後に登録されたメソッドを実行
                OnLogMessage("受付再開始");

            }

        }

 

        // ==============
        // 接続要求受け入れ一時中断メソッド
        //  外部からの要求の受け付けが実行されている場合、本メソッドで、その
        //  受け付け処理を中断する。なお、一時的中断であり、終了ではない。
        public void AcceptanceSuspend()
        {
            // まだスレッドが生成されていない場合
            if (ListeningCallbackThread == null)
            {
                return;
            }


            // スレッドが中断されていない場合
            //  --- スレッドステータス(状態)が、
            //      「スレッドが中断されている」を示しているか、もしくは、
            //      「スレッドの中断の要求処理が行なわれた」を示している場合ではない場合
            if *5 == 0)
            {

                // 一時中断
                ListeningCallbackThread.Suspend();


                // ログ関連の情報伝達
                //  --- クラスオブジェクト生成後に登録されたメソッドを実行
                OnLogMessage("受付一時中断");

            }
        }

 

        // ==============
        // スレッド終了中、実行中、中断中判定
        // 戻り値: 0:終了中 / 1:実行中 / 2:中断中
        public int JudgeIfThreadEnd()
        {
            // まだスレッドが生成されていない場合
            if (ListeningCallbackThread == null)
            {
                // 終了
                return 0;
            }


            // スレッドが既に実行されている場合
            //  --- スレッドステータス(状態)が、
            //      「スレッド上に Thread.Start メソッドを呼び出していない」を示しているか、もしくは、
            //      「スレッドを停止している」を示している場合ではない場合
            if *6 == 0)
            {
                // スレッドが中断されている場合
                //  --- スレッドステータス(状態)が、
                //      「スレッドが中断されている」を示しているか、もしくは、
                //      「スレッドの中断の要求処理が行なわれた」を示している場合である場合
                if *7 != 0)
                {
                    // 中断
                    return 2;
                }
                else
                {
                    // 実行
                    return 1;
                }
            }
            else
            {
                // 終了
                return 0;
            }

        }


    }
}



さいごに


本ページの内容説明については、元ページを参照して下さい。



*1:ListeningCallbackThread.ThreadState &
                (System.Threading.ThreadState.Unstarted |
                System.Threading.ThreadState.Stopped

*2:ListeningCallbackThread.ThreadState &
                (System.Threading.ThreadState.Unstarted |
                System.Threading.ThreadState.Stopped

*3:ListeningCallbackThread.ThreadState &
                    (System.Threading.ThreadState.Suspended |
                    System.Threading.ThreadState.SuspendRequested

*4:ListeningCallbackThread.ThreadState &
                (System.Threading.ThreadState.Suspended |
                System.Threading.ThreadState.SuspendRequested

*5:ListeningCallbackThread.ThreadState &
                (System.Threading.ThreadState.Suspended |
                System.Threading.ThreadState.SuspendRequested

*6:ListeningCallbackThread.ThreadState &
                (System.Threading.ThreadState.Unstarted |
                System.Threading.ThreadState.Stopped

*7:ListeningCallbackThread.ThreadState &
                    (System.Threading.ThreadState.Suspended |
                    System.Threading.ThreadState.SuspendRequested