BREW ヘルパ関数とは?
BREW では ANSI 標準 C ライブラリが使えませんが、文字列処理、数学計算、メモリ操作など ANSI 標準 C ライブラリと同等の機能を持つ関数が、BREW ヘルパー関数として用意されています 。
BREW ヘルパ関数は、BREW インターフェースのインスタンス生成が不要です。
BREW SDKの AEEStdLib.hというヘッダで宣言されていますので、BREW ヘルパ関数を使うときは、このファイルをインクルードします。
※ BREW ヘルパ関数には、 ANSI 標準 C ライブラリにはない、BREW 特有の便利な関数も含まれます。
関連情報 : BREW プログラミング入門 「BREW の文字列について知ろう !」
タイマーとは?
タイマーとは、一定時間の経過後に関数を呼び出してくれる仕組みのことです。 アニメーションの表示など、ある一定のタイミングで処理を行いたい場合に使用します。 タイマーを使用するには、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);
}
タイマーとアラームの違いは?
ある処理を一定時間後、或いは一定時間間隔で自動的に実行させる場合、「タイマー」または「アラーム」を使います。
「タイマー」はミリ秒単位で設定し、コールバック関数で処理します。
「アラーム」は分単位で設定し、EVT_ALARMイベントに対するイベントハンドリングとして処理します。
「タイマー」はサスペンド中は無効ですが、「アラーム」ではサスペンドしていても有効です。
「タイマー」はミリ秒単位の短い処理に、「アラーム」は分単位の長い処理に使われます。
関連情報 : タイマーとは?
インタフェースオブジェクトへのポインタが有効かどうか調べるには
インターフェイスオブジェクトへのポインタが有効であるかどうかを判定する一般的な手段はありません。
インターフェイスを使用したい場合は、ポインタが無効にならないように参照カウントを自前で管理する必要があります。
BREWでISHELL_BrowseURLで内部ブラウザを立ち上げたいが、その時に元のBREWアプリを終了させる方法は?
内部ブラウザの呼び出し時に、呼び出し元の BREW アプリのみの終了はできないようです。ISHELL_BrowseURL() の呼出し後に、ISHELL_CloseApplet() を呼び出す実験をしてみました。ISHELL_CloseApplet() を呼び出すと、内部ブラウザの起動前に、BREW アプリが終了してしまいますので、内部ブラウザの起動が出来ません。また、内部ブラウザを起動すると、呼び出しもとの BREW アプリは終了できませんでした。
上記の実験結果から、内部ブラウザの起動時は、BREW アプリを終了しないことが望ましいと思われます。
ISOUNDPLAYER_SetStream() の引数 (IAStream インターフェース) に独自に IFile インターフェースから派生したものを設定しようと思っていますが、IFile インターフェースからの派生の方法は?
ISOUNDPLAYER_SetStream() の第二引数には、IFile 派生インターフェイスを設定する必要はありません。IAStream 派生インターフェイスであれば十分です。