ホーム > デベロッパ > BREW プログラミング入門 > サスペンドとレジューム > - 2 / 2 -

サスペンドとレジューム - 2 / 2 -

SophiaFramework によるアプリ

最初に、"Push Select Key... " を表示します。
セレクトキーが押されると、2 つのウインドウを開きます。それぞれのウインドウで通信が開始します。通信のプロセスは前ページと同じです。
いつサスペンドしても正常にレジュームします。通信中の場合、サスペンド時に通信はキャンセルされます。

イベントハンドリング

サスペンド / レジューム時の処理は、ハンドラとして登録します。キーハンドラと同様です。

// コンストラクタ(ウィンドウ生成時に実行)
WebWindow::WebWindow(SFXAnsiStringConstRef url, SFXRectangleConstRef rect)
    : SFRTitleWindow(SFRApplication::GetInstance(), rect, url), _url(url) static_throws
{
    // キー ハンドラを登録
    if (static_try()) {
        static_throw(RegisterHandler(SFEVT_KEY, HANDLER_AFTER,
                                     HANDLER_FUNCTION(OnKey)));
        if (static_try()) {
            // レジュームハンドラを登録
            static_throw(RegisterHandler(SFEVT_APP_RESUME, HANDLER_BEFORE,
                                         HANDLER_FUNCTION(OnResume)));
            if (static_try()) {
                // サスペンドハンドラを登録
                static_throw(RegisterHandler(SFEVT_APP_SUSPEND, HANDLER_AFTER,
                                             HANDLER_FUNCTION(OnSuspend)));
                if (static_try()) {
                    //(略)
                }
            }
        }
    }
    return;
}

// アプリ再開ハンドラ
HANDLER_IMPLEMENT_VOIDRESUME(WebWindow, OnResume, environment)
{
    unused(environment);

    _web = SFBWeb::NewInstance();
    if (_web != null) {
        WebOpt webopts[2];

        // 接続のタイムアウト時間の設定 (ms)
        webopts[0].nId = WEBOPT_CONNECTTIMEOUT;
        webopts[0].pVal = (void*)10000;

        // WebOpt 終了マーク
        webopts[1].nId = WEBOPT_END;

        // オプション設定
        _web->AddOpt(webopts);
    }
    return;
}

// アプリ中断ハンドラ
HANDLER_IMPLEMENT_VOIDSUSPEND(WebWindow, OnSuspend, reason, info)
{
    unused(reason);
    unused(info);

    _callback.Cancel();
    _web.Release();
    return;
}

SophiaFramework は、サスペンドとレジュームのイベントを個々のコンポーネントに通知します。クラス毎にイベント処理するので、アプリのクラス構成が複雑でも、オブジェクト指向流にエレガントにサスペンド/レジュームできます。