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