サスペンドとレジューム - 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 を使用して作成したソースコード

SFSuspendApp41.zip (SophiaFramework 4.1)

















