voile.thread

thread モジュール

よく使用するスレッドのインターフェースを利用可能。
  • LifeControlThread
  • LoopThread
  • Signal


Date:
December 08, 2008

Author:
P.Knowledge, SHOO

Lisence:
NYSL ( http://www.kmonos.net/nysl/ )



class LifeControlThread : tango.core.Thread.Thread;
外部から殺すことのできるスレッド

外部では kill 関数を呼ぶことでスレッドを殺すことが可能。
内部では isAlive 関数を呼んだ場合に殺されたかどうかを検知する。

Example:
 class X
 {
     private LifeControlThread m_LifeControlThread;
     private void run()
     {
         while (isAlive)
         {
             Sleep(1000);
             msgBox("!");
         }
     }

     this()
     {
         m_LifeControlThread = new LifeControlThread(&run);
     }

     void start()
     {
         m_LifeControlThread.start;
     }

     void stop()
     {
         m_LifeControlThread.kill;
     }
 }


this(void delegate() aDelegate, size_t sz = 0);
this(void function() aFunction, size_t sz = 0);
this(DelegateFunction!(void) aFunction, size_t sz = 0);
コンストラクタ

See Also:
tango.core.Thread;

bool isAlive ();
スレッドは生きている

void kill ();
スレッドを殺す

class LoopThread : voile.thread.LifeControlThread;
ループスレッド

何回もおなじことを繰り返す際に使用すると便利。

Example:
 class X2
 {
     private LoopThread m_LoopThread;
     private void run()
     {
         Sleep(1000);
         msgBox("!");
     }

     this()
     {
         m_LoopThread = new LoopThread(&run);
     }

     void start()
     {
         m_LoopThread.start();
     }

     void stop()
     {
         m_LoopThread.kill();
     }
 }


this(void delegate() aDelegate, size_t sz = 0);
this(void function() aFunction, size_t sz = 0);
this(DelegateFunction!(void) aFunction, size_t sz = 0);
コンストラクタ

See Also:
tango.core.Thread;

class Signaler ;
シグナルの管理クラス

Windowsの CreateEvent や SetEvent のラッパー Windows以外の環境でも動作するが、最適な実装ではないかもしれない。

Example:
Signaler[3] ev;
int data;
void run1()
{
	data = 1;
	ev[0].signal = true;
}

void run2()
{
	data = 2;
	ev[1].signal = true;
}

void run3()
{
	data = 3;
	ev[2].signal = true;
}
void main()
{
	ev[] = [new Signaler, new Signaler, new Signaler];
	scope t = new ThreadGroup;
	data = 0;
	t.create(&run1);
	ev[0].wait;
	assert(data == 1);
	data = 0;
	t.create(&run2);
	ev[1].wait;
	assert(data == 2);
	data = 0;
	t.create(&run3);
	ev[2].wait;
	assert(data == 3);
}


void* handle ();
ハンドルを得る

ただしOS依存する処理をする場合にのみ使用すること

this(HANDLE aHandle);
コンストラクタ

Params:
HANDLE aHandle イベントハンドル

this(bool aFirstCondition = false);
コンストラクタ

Params:
bool aFirstCondition 初期状態

bool signal ();
シグナル状態を返す

Returns:
trueならシグナル状態で、waitはすぐに制御を返す falseなら非シグナル状態で、waitしたらシグナル状態になるか、時間が 過ぎるまで制御を返さない状態であることを示す。

void signal (bool aCondition);
シグナル状態を設定する

Params:
bool aCondition

trueならシグナル状態にし、waitしているスレッドの制御を返す。 falseなら非シグナル状態で、waitしたらシグナル状態になるまで制御を 返さない状態にする。

void wait ();
シグナル状態になるまで待つ

conditionがtrueならシグナル状態であり、すぐに制御が返る。 conditionがfalseなら非シグナル状態で、シグナル状態になるまで制御を 返さない。

bool wait (double period);
シグナル状態になるまで待つ

conditionがtrueならシグナル状態であり、すぐに制御が返る。 conditionがfalseなら非シグナル状態で、シグナル状態になるか、時間が 過ぎるまで制御を返さない。

Page was generated with on Fri Apr 3 17:07:43 2009