ホーム > デベロッパ > BREW FAQ

BREW FAQ : タイマーとは?

タイマーとは?

タイマーとは、一定時間の経過後に関数を呼び出してくれる仕組みのことです。 アニメーションの表示など、ある一定のタイミングで処理を行いたい場合に使用します。 タイマーを使用するには、ISHELL_SetTimer 関数や ISHELL_SetTimerEx 関数を使用します。

たとえば、ISHELL_SetTimer 関数は以下のように定義されています。

ISHELL_SetTimer(
 IShell*   shell ,      // IShell インターフェイス
 int32     millisecs ,  // タイマーが経過時間をミリ秒で指定します。
 PFNNOTIFY fn,          // コールバック関数を指定します。
 void*     data         // コールバック関数に渡されるデータを指定します。
);

タイマーにより呼び出されるコールバック関数は、以下のプロトタイプをもつ必要があります。

// コールバック関数のプロトタイプ宣言
void TimerCallBack(void* pData);

SophiaFramework では、 SFBShell::SetTimer 関数や SFBShell::SetTimerEx 関数を使用します。 タイマーに登録するコールバック関数は、 void* 型の引数を持つ戻り値なしの関数を使用します。

【 コード例 】

[ BREW API のみを使用したコード ]

//
// タイマーを使用して図形を移動します。
//
void OnTimer(void* data)
{
    ShapeApplet* app = (ShapeApplet*)data;
    IGraphics*   graphic;

    // 図形を移動します。
    app->x +=  RandInt(3) - 1;
    app->y +=  RandInt(3) - 1;
    app->r  =  ABS(app->r + RandInt(3) - 1);

    // IGraphics インターフェイスを作成します。
    ISHELL_CreateInstance(app->a.m_pIShell, AEECLSID_GRAPHICS, (void**)&graphic);

    // 図形を描画します。
    Shape_OnDraw(app, graphic);

    // IGraphics インターフェイスを破棄します。
    IGRAPHICS_Release(graphic);

    // 再度タイマーを設定します。
    ISHELL_SetTimer(app->a.m_pIShell, 100, OnTimer, app);
}

[ SophiaFramework を使用したコード ]

//
// タイマーを使用して図形を移動します。
//

// シェイプクラスのクラス定義
SFMTYPEDEFCLASS(Shape)
class Shape :public SFRApplication
{
private:
    SFXCircle    _circle;

private:
    // 描画ハンドラ
    HANDLER_DECLARE_VOIDRENDER(Shape, OnDraw)

    // タイマーハンドラ
    Void OnTimer(Void);
    static Void OnTimerEntry(VoidPtr data)
    {
        static_cast<ShapePtr>(data)->OnTimer();
    }
};

//
// タイマーで呼び出される関数
//
Void Shape::OnTimer(Void)
{
    // SFBShell インスタンスを作成します。
    SFBShellSmp  shell = SFBShell::GetInstance();

    // 図形を移動します。
    _circle.r   = ABS(_circle.r + RandInt(3) - 1);
    _circle.cx += RandInt(3) - 1;
    _circle.cy += RandInt(3) - 1;

    // 図形を描画します。
    InvalidateContent();

    // 描画イベントを送信します。
    Invoke(SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, false));

    // 再度タイマーを設定します。
    shell->SetTimer(100, OnTimerEntry, this);
}