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

<C#>
「マウスのホイール操作で、キャラクター画像をズームさせる画像処理を、マルチスレッドで行なう」のコード No.2


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

.






元のページ


元ページ「<C#> マウスのホイール操作で、キャラクター画像をズームさせる画像処理を、マルチスレッドで行なう」
http://note.chiebukuro.yahoo.co.jp/detail/n165471

 

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



 



 

本ページの前のページ


 

「<C#> マウスのホイール操作で、キャラクター画像をズームさせる画像処理を、マルチスレッドで行なう」のコード No.1
http://note.chiebukuro.yahoo.co.jp/detail/n170545

 

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







 

本ページの次のページ


「<C#> マウスのホイール操作で、キャラクター画像をズームさせる画像処理を、マルチスレッドで行なう」のコード No.3
http://note.chiebukuro.yahoo.co.jp/detail/n170547

 

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















はじめに


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








画像処理クラスのコード




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


// マウスのホイール操作で、キャラクター画像をズームさせる画像処理を、マルチスレッドで行なう。
namespace ZoomThreadSimple1
{


    // ************************************
    // ************************************
    // 画像処理クラス
    //  本クラスは、画像移動を行なうスレッドを管理します。
    //  なお、本クラスは、画像移動等のグラフィック処理関係の要求受付を行な
    //  うクラスから呼び出されて実行されます。
    // ************************************
    // ************************************
    public partial class GraphicsThread : IAsyncResult
    {

 

        //===================================
        // コンストラクタ
        //===================================


        //============
        // コンストラクタ
        public GraphicsThread(
            System.Threading.ManualResetEvent All_Done)
        {

            // 特に処理なし。


            AllDone = All_Done;

        }

 

        //============
        // コンストラクタ
        //  --- 本クラス内でのみ使用されるローカルなコンストラクタです。
        // 第1引数: 非同期処理のステータスを表すクラスオブジェクト
        private GraphicsThread(
            IAsyncResult Async_Callback)
        {

            _I_Async_Callback_ = Async_Callback;

        }

 


        //===================================
        // メンバー変数、及びプロパティ
        //===================================

 

        // 待機中のスレッドを管理するオブジェクト
        public static System.Threading.ManualResetEvent AllDone;


        //============
        // 要求電文取得プロパティ
        public RequiredCall RequiredCallProperty
        {
            get
            {
                object[] Async_State = (object[])_I_Async_Callback_.AsyncState;
                return (RequiredCall)Async_State[0];
            }
        }

 

        //===================================
        // メンバーメソッド
        //===================================


        //============
        // 画像移動スレッド開始メソッド
        // 第1引数: 要求電文
        // 第2引数: 非同期処理の完了時に呼び出されるコールバック メソッド
        //           を参照するデリゲート
        // 戻り値: 非同期処理のステータスを表すクラスオブジェクト(ただし、
        //         IAsyncResultではなく、それを実装した本クラス)
        public GraphicsThread BeginMoveImage(
            RequiredCall Required_Call,
            AsyncCallback Async_Callback)
        {

            // スレッド作成
            //  --- 画像移動処理スレッド用メソッドをスレッド用メソッドとして登録
            GraphicsMethodDelegate Caller = new GraphicsMethodDelegate(ZoomImageProcessing);


            // スレッドを起動し、画像移動処理スレッド用メソッドを実行します。
            IAsyncResult I_Asy_Res_Wotk = Caller.BeginInvoke(Required_Call, Async_Callback, new object[] { Required_Call });


            //============
            // AllDoneをシグナル状態にする。
            // すなわち、接続待ちスレッドのロックを解除して、接続待ちスレッドの実
            // 行再開の許可をする。
            //  --- 上記処理で、画像移動処理スレッド用メソッドの実行(画像移動処理
            //      スレッドの起動開始)が完了したので、本スレッドを呼び出した元の
            //      プログラムのロックを解除します。
            AllDone.Set();


            // 非同期処理のステータスを表すクラスオブジェクトを、
            // IAsyncResult型からGraphicsThread型に変換。
            // (GraphicsThread型のほうが、本クラスに実装
            //  した各種機能を利用可能になるため)
            GraphicsThread AsyRes = new GraphicsThread(
                I_Asy_Res_Wotk);


            // 非同期処理のステータスを表すクラスオブジェクト
            return AsyRes;

        }

 

        //============
        // 画像移動スレッド終了メソッド
        // 第1引数: 非同期処理のステータスを表すクラスオブジェクト
        // 戻り値: 処理結果(画像移動をした処理結果の画像)
        public System.Drawing.Image EndMoveImage(
            IAsyncResult Asy_Res)
        {

            RequiredCall Required_Call;

            return EndMoveImage(
                Asy_Res,
                out Required_Call);

        }

 


        //============
        // 画像移動スレッド終了メソッド
        // 第1引数: 非同期処理のステータスを表すクラスオブジェクト
        // 第2引数: 要求電文を出力
        // 戻り値: 処理結果(画像移動をした処理結果の画像)
        public System.Drawing.Image EndMoveImage(
            IAsyncResult Asy_Res,
            out RequiredCall Required_Call)
        {

            // GraphicsThread型に復元
            GraphicsThread Graphics_Thread = Asy_Res as GraphicsThread;
            if (Graphics_Thread == null)  // 元はGraphicsThread型では無かった場合
            {

                // EndInvoke()メソッドで、スレッドの完了処理を実行。
                // 及びワーカースレッドでの処理結果の受け取り。
                // ワーカースレッドの処理が完了するまで、 EndInvoke メソッドはブロックする。
                System.Drawing.Image Result_Work = _End_Move_Image_(
                    Asy_Res, out Required_Call);


                // 処理結果返却
                return Result_Work;

            }

 

            // EndInvoke()メソッドで、スレッドの完了処理を実行。
            // 及びワーカースレッドでの処理結果の受け取り。
            // ワーカースレッドの処理が完了するまで、 EndInvoke メソッドはブロックする。
            System.Drawing.Image result = _End_Move_Image_(Graphics_Thread._I_Async_Callback_, out Required_Call);

 


            //------------------------
            // 処理結果返却
            return result;

        }

 

        //============
        // 画像移動スレッド終了メソッド
        // 第1引数: 非同期処理のステータスを表すクラスオブジェクト
        // 第2引数: 要求電文を出力
        // 戻り値: 処理結果(画像移動をした処理結果の画像)
        private System.Drawing.Image _End_Move_Image_(
            IAsyncResult Asy_Res,
            out RequiredCall Required_Call)
        {

            //------------------------
            // EndInvoke を使って、非同期呼び出しによるスレッドから、返却値を取得する。
            //  --- スレッドの非同期呼び出しでの結果「AsyRes」はカプセル化されています。
            //      よって、処理結果を取り出すために、まず、結果AsyResをキャストする必要がある。


            // 結果を取り出すための非同期結果のキャスト。
            System.Runtime.Remoting.Messaging.AsyncResult aResult = (System.Runtime.Remoting.Messaging.AsyncResult)Asy_Res;


            // 非同期の呼び出しが行われたデリゲートオブジェクトを取得。
            GraphicsMethodDelegate dele = (GraphicsMethodDelegate)aResult.AsyncDelegate;

 

            // EndInvoke()メソッドで、スレッドの完了処理を実行。
            // 及びワーカースレッドでの処理結果の受け取り。
            // --- ワーカースレッドの処理が完了するまで、このコールバックメソッドは、
            //     呼び出されない。すなわち、下記のEndInvoke メソッドは、実行されな
            //     い。EndInvoke メソッドがブロックするのであるから、ワーカースレッ
            //     ドの処理完了までは、アプリケーションはブロックされない。
            System.Drawing.Image result = dele.EndInvoke(Asy_Res);


            //------------------------
            // デリゲート呼び出しのパラメータを取得。
            object[] ParaArray = (object[])Asy_Res.AsyncState;
            Required_Call = (RequiredCall)(ParaArray[0]); // 第1引数


            //------------------------
            // 処理結果返却
            return result;

        }

 

        //===================================
        // IAsyncResult関連のプロパティ等
        //===================================

 

        // 非同期処理のステータスを表すクラスオブジェクトです。
        private readonly IAsyncResult _I_Async_Callback_;


        // 非同期処理についての情報(ユーザー定義のオブジェクト)を取得するプ
        // ロパティです。
        // 具体的には、要求電文の値を取得します。
        // -------
        // IAsyncResultインターフェイスを実装した場合は、本プロパティを必ず
        // 定義するように定められています。
        public object AsyncState
        {
            get
            {
                // IAsyncResult型オブジェクトの値をそのまま取得。
                return _I_Async_Callback_.AsyncState;
            }
        }


        // 非同期処理が完了するまで待機するためための機能 WaitHandle を取得
        // するプロパティです。
        // -------
        // IAsyncResultインターフェイスを実装した場合は、本プロパティを必ず
        // 定義するように定められています。
        public System.Threading.WaitHandle AsyncWaitHandle
        {
            get
            {
                // IAsyncResult型オブジェクトの値をそのまま取得。
                return _I_Async_Callback_.AsyncWaitHandle;
            }
        }


        // 非同期処理が同期的に完了したかどうかを示す値を取得するプロパティです。
        // -------
        // IAsyncResultインターフェイスを実装した場合は、本プロパティを必ず
        // 定義するように定められています。
        public bool CompletedSynchronously
        {
            get
            {
                // IAsyncResult型オブジェクトの値をそのまま取得。
                return _I_Async_Callback_.CompletedSynchronously;
            }
        }


        // 非同期処理が完了したかどうかを示す値を取得するプロパティです。
        // -------
        // IAsyncResultインターフェイスを実装した場合は、本プロパティを必ず
        // 定義するように定められています。
        public bool IsCompleted
        {
            get
            {
                // IAsyncResult型オブジェクトの値をそのまま取得。
                return _I_Async_Callback_.IsCompleted;
            }
        }

 

    }
}



さいごに


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