タイマーとは?
タイマーとは、一定時間の経過後に関数を呼び出してくれる仕組みのことです。 アニメーションの表示など、ある一定のタイミングで処理を行いたい場合に使用します。 タイマーを使用するには、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);
}









