ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : タイマー

C++ で作成されたBREW アプリで、タイマー処理を行う方法です。
SophiaFramework を用いています。

SFXTask クラスを使った処理の分割方法

1 秒以上時間がかかる処理は SFXTask を用いて 1 秒以内で終了する処理に分割して実行します。

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

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

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

    _index = 1;
    _sum = 0;

    // BREW に呼び出されるコールバック関数を設定する
    _task.Set(CALLBACK_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 から呼び出される )
CALLBACK_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(&qout;%d(&qout; _sum);
    }
}
      

タイマーを使用する(クラスメンバ関数を使用する場合)

バージョン 4.0 以降

class MyClass {
private:
    SFXTimer _timer; // タイマークラス
public:
    Void Function(Void);
    CALLBACK_DECLARE_SFXTIMER(TimerCallback)
};

Void MyClass::Function(Void) {
    // 4000 ミリ秒後に TimerCallback が呼び出される
    _timer.Set(CALLBACK_FUNCTION(TimerCallback));
    _timer.Schedule(4000);
}

// 呼び出される関数
CALLBACK_IMPLEMENT_SFXTIMER(MyClass, TimerCallback) {
    ...
}

バージョン 3.0

SFMTYPEDEFCLASS(MyClass)
class MyClass {
public:
    Void Function(Void);    // タイマーの呼び出し元
    Void Callback(Void);          // タイマーで呼び出したい関数

    // タイマーに登録する関数は static でなければならない
    static Void CallbackEntry(VoidPtr data);
};

Void MyClass::Function(Void) {
    // タイマーには static 関数を登録する
  // 第3引数は this とする
    SFBShell::GetInstance()->SetTimer(4000, CallbackEntry, this);
};

// static 関数からメンバ関数を呼び出す
Void MyClass::CallbackEntry(VoidPtr data) {
    static_cast<MyClassPtr>(data)->Callback();
}

Void MyClass::Callback(Void) {
    ...
}

参照 SFXTimer::Set | SFXTimer::Schedule |
SFBShell::GetInstance | SFBShell::SetTimer | SFBShell::CancelTimer

      

タイマーをキャンセルする

バージョン 4.0 以降

タイマーをキャンセルするには、SFXTimer::Cancel 関数を使用します。

SFXTimer timer;

// 4000 ミリ秒後に Function を呼び出すタイマーをセット
timer.Set(Function);
timer.Schedule(4000);
...

// 前でセットしたタイマーをキャンセル
timer.Cancel();

バージョン 3.0

タイマーをキャンセルするには、SFBShell::CancelTimer 関数を使用します。

// 4000 ミリ秒後に Function を呼び出すタイマーをセット
SFBShell::GetInstance()->SetTimer(4000, Function, data);

...

// 前でセットしたタイマーをキャンセル
SFBShell::GetInstance()->CancelTimer(Function, data);

参照 SFXTimer::Set | SFXTimer::Schedule | SFXTimer::Cancel |
SFBShell::GetInstance | SFBShell::SetTimer | SFBShell::CancelTimer

      

タイマーを使用する(一定時間後にある処理を行う)

バージョン 4.0 以降

タイマーを使用するには、SFXTimer クラスを使用します。

SFXTimer timer; // タイマークラス

timer.Set(Function, data); // コールバック関数を設定
                           // (data には任意のデータを設定できる)
timer.Schedule(4000); // 4000 ミリ秒後に Function が呼ばれるようにする

タイマーの設定中にタイマークラスのインスタンスを破棄しないように注意してください。
(上のコードでは、関数が終了すると timer が破棄されます)

data は設定したデータ
Void Function(VoidPtr data) {
    ...
}

タイマーをセットしている間にアプリを終了させる場合、SFXTimer::Cancel 関数を
呼び出してタイマーをキャンセルする必要があります。

バージョン 3.0

タイマーを使用するには、SFBShell::SetTimer 関数を使用します。

// 4000 ミリ秒後に Function が呼び出される
// data には任意のデータ(VoidPtr 型)がセットできる
SFBShell::GetInstance()->SetTimer(4000, Function, data); 
// 呼び出される関数。data はセットしたデータ
void function(VoidPtr data) {
    ...
}

タイマーをセットしている間にアプリを終了させる場合、タイマーをキャンセルする必要があります。

参照 SFXTimer::Set | SFXTimer::Schedule | SFXTimer::Cancel
SFBShell::GetInstance | SFBShell::SetTimer