サスペンドとレジューム - 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 は、サスペンドとレジュームのイベントを個々のコンポーネントに通知します。クラス毎にイベント処理するので、アプリのクラス構成が複雑でも、オブジェクト指向流にエレガントにサスペンド/レジュームできます。
記事掲載プログラムのソースコード
SophiaFramework UNIVERSE を使用して作成したソースコード
suspendapp_sf.zip (SophiaFramework UNIVERSE 5.1)