前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

19.3. タイマー クラス

SFXTimer はタイマーを扱うクラスです。

例 19.8. SFXTimer クラスの使い方

// タイマーはクラスのメンバ変数として定義する
class MyClass {
private:
    SFXTimer _timer;
public:
    Void Start(Void);
    
    // コールバック関数
    XALLBACK_DECLARE_SFXTIMER(OnTimer)
};

Void MyClass::Start(Void)
{
    SFCError error;

    // タイマーにより呼び出される OnTimer 関数を設定する
    _timer.Set(XALLBACK_FUNCTION(OnTimer));

    // タイマーをセットする
    // (1000 ミリ秒後に OnTimer 関数が呼び出される )
    error = _timer.Schedule(1000);

    if (error != SFERR_NO_ERROR) {
        // エラーのとき ( OnTimer 関数は呼び出されない )
    }
}

// タイマーによって呼び出されるコールバック関数
XALLBACK_IMPLEMENT_SFXTIMER(MyClass, OnTimer)
{
    TRACE("timer");
    
    // 以下のコードを追加すると、1000 ミリ秒毎にタイマーが呼び出されるようになる
    // _timer.Schedule(1000);
}
[Caution] SFXTimer クラスのインスタンスの保持

タイマーを利用しているときは、 SFXTimer クラスのインスタンスを解放してはいけません。

例 19.9. タイマーのキャンセル

// タイマーをキャンセルする
// この関数は任意の場所から呼び出してよい
_timer.Cancel();

SFXTimer のデストラクタでも SFXTimer::Cancel 関数が呼ばれます。

BREW 環境では、約 1 秒以内で処理を終える必要があります。 そのため、1 秒以上時間がかかる処理は 1 秒以内で終了する処理に分割し、SFXTask クラスを使って 実行します。

例 19.10. タスク分割

// SFXTask はクラスのメンバ変数として定義する
class MyClass {
private:
    SFXTask _task;
    SInt32 _index;
    SInt32 _sum;
public:
    Void Start(Void);
    SInt32 Calculate(SInt32 index);

    // コールバック関数
    XALLBACK_DECLARE_SFXTASK(OnTask)
};

Void MyClass::Start(Void)
{
    SFCError error;

    _index = 1;
    _sum = 0;

    // BREW 環境から呼び出される OnTask 関数を設定する
    _task.Set(XALLBACK_FUNCTION(OnTask));

    // タスクを登録する
    error = _task.Schedule();

    if (error != SFERR_NO_ERROR) {
        // エラーのとき ( OnTask 関数は呼び出されない )
    }
    
    // このコードが終了すると、制御が BREW 環境に戻り、
    // 暫くすると BREW 環境から OnTask 関数が呼び出される
}

// 時間のかかる計算
SInt32 MyClass::Calculate(SInt32 index)
{
    SInt32 i;
    for (i = 0; i < 5000000; ++i) {
        ;
    }
    return index;
}

// コールバック関数 ( BREW 環境から呼び出される )
XALLBACK_IMPLEMENT_SFXTASK(MyClass, OnTask)
{
    SFCError error;

    if (_index <= 100) { // 計算を 100 回に分割して行う
        // _index 回目の計算を行う
        _sum += Calculate(_index);
        ++_index;
        // 再びタスクを登録する ( BREW 環境から OnTask 関数が再び呼び出される )
        error = _task.Schedule();

        if (error != SFERR_NO_ERROR) {
            // エラーのとき ( OnTask 関数は呼び出されない )
        }
    }
    else {
        // 結果を表示する
        TRACE("%d", _sum);
    }
}

このコードは以下のコードと同じ計算をします。

SInt32 i;
SInt32 sum = 0;
for (i = 1; i <= 100; ++i) {
    sum += Calculate(i);
}