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