「<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