TNB Library
公開メンバ関数 | 全メンバ一覧
CSyncWaitableTimer クラス

WaitableTimer排他管理クラス [詳解]

#include <TnbSyncWaitableTimer.h>

+ CSyncWaitableTimer の継承関係図

公開メンバ関数

 CSyncWaitableTimer (bool boIsManualReset=false, LPCTSTR lpszName=NULL)
 コンストラクタ [詳解]
 
 CSyncWaitableTimer (HANDLE hTimer)
 コンストラクタ [詳解]
 
virtual HANDLE GetHandle (void) const
 [取得] ハンドル取得 [詳解]
 
virtual bool Lock (DWORD dwTime=INFINITE) const
 [排他] ロック [詳解]
 
 operator HANDLE (void) const
 [取得] ハンドル取得 [詳解]
 
bool Start (DWORD dwLagTime, DWORD dwInterval)
 [排他] 開始 [詳解]
 
void ToLock (void)
 [排他] ロック状態にする. [詳解]
 
virtual void Unlock (void) const
 [排他] アンロック. [詳解]
 
virtual ~CSyncWaitableTimer (void)
 デストラクタ [詳解]
 

詳解

WaitableTimer排他管理クラス

WaitableTimerを使った同期を実現します。
覚え書き
多少他の ISynchronized を実装している排他クラスとは使用方法が異なります。
定期的にアンロックを発生させる場合、タイミング(処理内容)によっては、 二つ以上のスレッドが同時に動くことがあります(指定時間ごとに、アンロックになるため)。
使用例

    static CSyncWaitableTimer s_timer;
    DWORD WINAPI DoThread(DWORD ThreadCount)
    {
        for ( int i = 0; i < 5; i++) 
        {
          EXCLUSIVE(&s_timer);
          TRACE1("スレッド%d: 処理開始\n", ThreadCount);
          Sleep(400*ThreadCount);
          TRACE1("スレッド%d: 処理終了\n", ThreadCount);
        }
        return 0;
    }
    void Main()
    {
        HANDLE hThread[2];
        DWORD ThreadID[2];
        for ( int i = 0; i < 2; i++ ) 
        {
          hThread[i] = CreateThread(
                NULL, 0, (LPTHREAD_START_ROUTINE)DoThread,
                (LPVOID)i, 0, &ThreadID[i]);
        }
        TRACE0("開始\n");
        s_timer.Start(1000,1000);
        WaitForMultipleObjects(2, hThread, TRUE, INFINITE);// スレッドの終了まで待機       
        CloseHandle(hThread[0]);
        CloseHandle(hThread[1]);
    }
 
参照
http://msdn.microsoft.com/library/ja/jpdllpro/html/_win32_createwaitabletimer.asp
必要ファイル
TnbSyncWaitableTimer.h
日付
06/09/21 新規作成
06/11/15 作成失敗したら スローするように変更。

TnbSyncWaitableTimer.h86 行目に定義があります。

構築子と解体子

◆ CSyncWaitableTimer() [1/2]

CSyncWaitableTimer ( bool  boIsManualReset = false,
LPCTSTR  lpszName = NULL 
)
explicit

コンストラクタ

覚え書き
作成時は、ロック状態です。
引数
boIsManualResetfalseか省略なら自動リセットオブジェクト、 trueなら手動リセットオブジェクトになります。
lpszNameEventの名前。省略可能。
例外
CInvalidParamException名前不正など、同期オブジェクトが作成できなかった時、スローされます。

TnbSyncWaitableTimer.h100 行目に定義があります。

◆ CSyncWaitableTimer() [2/2]

CSyncWaitableTimer ( HANDLE  hTimer)
explicit

コンストラクタ

引数
hTimerCreateWaitableTimer()で作成したハンドル

TnbSyncWaitableTimer.h119 行目に定義があります。

◆ ~CSyncWaitableTimer()

virtual ~CSyncWaitableTimer ( void  )
virtual

デストラクタ

TnbSyncWaitableTimer.h125 行目に定義があります。

関数詳解

◆ GetHandle()

virtual HANDLE GetHandle ( void  ) const
virtual

[取得] ハンドル取得

戻り値
ハンドル

CAbstractSyncHandleを実装しています。

TnbSyncWaitableTimer.h137 行目に定義があります。

◆ Lock()

virtual bool Lock ( DWORD  dwTime = INFINITE) const
virtualinherited

[排他] ロック

引数
dwTimeロックにトライし続けるミリ秒。省略すると無限に待ちます。
戻り値
true成功
false失敗

ISynchronizedを実装しています。

TnbSync.h91 行目に定義があります。

◆ operator HANDLE()

operator HANDLE ( void  ) const
inherited

[取得] ハンドル取得

戻り値
ハンドル

TnbSync.h80 行目に定義があります。

◆ Start()

bool Start ( DWORD  dwLagTime,
DWORD  dwInterval 
)

[排他] 開始

引数
dwLagTime開始までの時間(ms)
dwInterval開始後、定期的にアンロックになる間隔(ms)。
0を指定すると、最初一回アンロック後、ずっとロック状態になります。 もう一度 Start をする必要があります。
戻り値
true成功
false失敗

TnbSyncWaitableTimer.h161 行目に定義があります。

◆ ToLock()

void ToLock ( void  )

[排他] ロック状態にする.

覚え書き
ロック状態に固定されます。

TnbSyncWaitableTimer.h177 行目に定義があります。

◆ Unlock()

virtual void Unlock ( void  ) const
virtual

[排他] アンロック.

覚え書き
本関数はダミーです。
Startで指定したタイミングでアンロック状態が一瞬発生するため、手動ではアンロックできません。

ISynchronizedを実装しています。

TnbSyncWaitableTimer.h147 行目に定義があります。