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

BREW C++ プログラミング : SophiaFramework 逆引き FAQ・コード集

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);
    }
}