2006年02月17日

KDDI、モバイル WiMAX の実用化確認と「ウルトラ3G」接続実験に成功

KDDI は2006年2月16日、IEEE802.16e準拠の無線システム「モバイル WiMAX」の市街地環境での実用化が可能であることを国内で初めて確認し、オール IP ベースの「ウルトラ3G」実証システムとの接続実験にも成功したと発表した。

この実験では、実効的な通信速度や基地局間の高速ハンドオーバーなどの基本的な性能や機能を評価し、市街地環境での実用化が可能であることが確認された。

また、モバイル WiMAX を「ウルトラ3G」のアクセスシステムの一つと位置づけ、システムの接続実験を実施。モバイル WiMAX に加え、EV-DO、ADSL などを併用し、世界ではじめてモバイル WiMAX と EV-DO との間のシームレスハンドオーバーに成功した。
posted by シンビアン at 12:32| Comment(0) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

ウィルコム、2008年度以降に試練到来〜エムレポートの PHS 市場調査

エムレポートは2006年2月15日、PHS 市場について調査したレポート「PHS サービスの最新動向2〜独り勝ちのウィルコム、2008年度以降に試練到来〜」を、Ns 総研から発刊した。

レポートは、ウィルコムの好調を大きく取り上げる一方、その原因を NTT ドコモやアステル各社の PHS ユーザがウィルコムへ移行している影響が大きいものとみている。そのためウィルコム本来の実績をみるには、第2位の NTT ドコモが事業を終了する見込みの2008年度以降が指標となるとしている。

また、ウィルコムに端末を提供しているメーカーに関しても言及。ウィルコム株式30%を保有する京セラは、PHS 端末と基地局で自社事業を拡大させると同時に、株主としてもウィルコムを後方支援していくだろうとしている。
posted by シンビアン at 12:31| Comment(1) | TrackBack(1) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

Vodafone、モバイル検索で Google と提携

大手検索ブランドの持つ力に気づいた移動体通信事業者が、その力にあやかろうとしている。

Vodafone は14日、移動体通信業界の国際イベント『3GSM World Congress』(2月13日-16日) において、Google (NASDAQ:GOOG) との提携を発表した。同社と協力して、加入者向けモバイル検索サービスを開発するという。具体的には、Vodafone が提供する消費者向けインターネットサービス『Vodafone live!』に、Google の検索機能を組み込む計画だ。

新しい検索サービスは、Vodafone の高速データネットワークを通じて提供し、Vodafone live! 内と Web 全体、両方のコンテンツを同時に検索可能なものになる。

Vodafone のグループ戦略担当ディレクタ Alan Harper 氏は声明の中で次のように語った。「革新的なモバイル検索は、情報やサービスに迅速かつ簡単にアクセスする手段として、移動の多い消費者からのニーズがますます高まり、今後重要性を増していくだろう。(Google 検索の統合で) 当社の顧客は目当ての情報やサービスをより迅速に見つけ出せるようになり、Vodafone live! のユーザー体験が向上する」

Vodafone との提携により、Google はパソコンの外の世界でさらに存在感を増すことになる。

Google は1月にも Research In Motion (RIM) との提携を発表し、RIM (NASDAQ:RIMM) のハンドヘルド端末『BlackBerry』のプラットフォームを、Google のインスタントメッセージ (IM) サービス『Google Talk』に対応させる計画を明らかにしたばかりだ。また2005年6月には、携帯サイトに特化した検索サービス『Google Mobile Web Search』を開始している。

今年の 3GSM World Congress でニュースを発表した検索大手は、Google だけではない。

同じく14日、Yahoo! (NASDAQ:YHOO) は、Symbian のプラチナパートナーに加わり、『Symbian OS』搭載携帯電話向けサービスの提供で協力していくことを明らかにした。Yahoo! が1月、家電見本市『Consumer Electronics Show』(CES) で発表した携帯電話向け新サービス『Yahoo! Go Mobile』は、Symbian OS 搭載電話に対応している。

Yahoo! はさらに、Rogers Communications 傘下の携帯電話事業者、Rogers Wireless の加入者に携帯電話向けサービスを提供することで、同社と合意に達したことも発表した。Yahoo! は以前から、同じく Rogers Communications 傘下のケーブル事業者、Rogers Cable と共同ブランドでブロードバンド向けインターネットサービスを提供している。
posted by シンビアン at 12:26| Comment(0) | TrackBack(1) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

2006年02月15日

ディスクリプタについて

今回のサンプルでは、複数箇所でディスクリプタを使用しています。以降ではこのディスクリプタについて見て生きたいと思います。ディスクリプタとは、Series60の中では、以下の代用として使用されます。

* NULLで終わる文字列
* バイト配列
* バイトポインタ

 今回のサンプル(FileTest.zipとFileTest2.zip)でもファイルから文字列を読み込んでくる箇所で、文字列を格納する領域としてディスクリプタを使用しています。具体的には、CFileTestDocument::ReadFile()関数の中では以下の箇所になります。 HBufCやTPtr などがディスクリプタになります。

HBufC* buf = HBufC::NewL(128);
TPtr ptr = buf->Des();
// 中略….
rStream >> ptr ;

 ディスクリプタの種類には以下の5種類があります。

* 抽象ディスクリプタ(TDes TDesC)
* リテラルディスクリプタ(TLitC)
* バッファディスクリプタ(TBuf, TBufC)
* ヒープディスクリプタ(HBuf)
* ポインタディスクリプタ(TPtr TPtrC)

 リテラルディスクリプタは特殊になりますが、ディスクリプタは配列やポインタをカプセル化した「スマートポインタ」と考えてくださればよいかと思います。つまり、ディスクリプタの保持する領域と、領域に関する情報(確保した領域や、現在の使用量など)をカプセル化しているものです。バッファディスクリプタとポインタディスクリプタの相違は、配列をカプセル化するか、それともポインタの指す領域をカプセル化するかになります。

 そして、バッファディスクリプタ、ポインタディスクリプタ双方とも「あるメモリ上の領域に対するアクセスの方法と、領域の情報を保持している」点は変わりません。そこで(オブジェクト指向で一般に行われるように)抽象的なディスクリプタのクラスを考えることができます。これが抽象ディスクリプタになるわけです。

 ここで、ディスクリプタ関連のクラスの階層関係を見ておきましょう(図1)。

■ 図1 8ビットディスクリプタクラスの派生 (出典:NRIラーニングネットワーク 「ノキア Series 60 C++開発入門コース」より)

 上記は8ビットのディスクリプタ(つまり保存されるデータのサイズがバイト単位となる)のクラス階層を示しています。通常は文字データの格納を考え、単にTDesCのクラスを使用したときは16ビットのディスクリプタとなるようにtypedefがなされています。16ビットのディスクリプタも同一のクラス階層を持っています。

 また、クラス名に「C」がついているものは変更用の操作が提供されず、単にデータの参照のみができます。これに対して、クラス名に「C」が付かないものはデータを参照する操作と変更する操作が提供されます。

 それでは、次にバッファディスクリプタとポインタディスクリプタ、ヒープディスクリプタの3つをもう少し見ていきましょう。

TBufCとTBuf(バッファディスクリプタ)

 TBufとTBufCは「配列の領域をカプセル化したディスクリプタである」とご理解ください。データ構造(16ビットのディスクリプタ)は下図のようになります(図2)。

■ 図2 メモリの構成図 (出典:NRIラーニングネットワーク 「ノキア Series 60 C++開発入門コース」より)

TPtrとTPtrC(ポインタディスクリプタ)

 バッファディスクリプタが配列をカプセル化しているのに対して、ポインタディスクリプタはポインタで指される領域をカプセル化します(図3)。

■ 図3 メモリの構成図 (TPtrC8) (出典:NRIラーニングネットワーク 「ノキア Series 60 C++開発入門コース」より)

HBufC (ヒープディスクリプタ)

 ヒープディスクリプタはヒープ上に確保した領域をカプセル化したディスクリプタです(図4)。

■ 図4 メモリの構成図 (出典:NRIラーニングネットワーク 「ノキア Series 60 C++開発入門コース」より)

 ヒープディスクリプタは若干特殊で、変更可能なディスクリプタであるHBufは存在しません。その代わり、HBufC::Des()関数で変更可能なポインタディスクリプタを取得することができます。

再度、今回のコードの断片を

 それでは、今回のサンプルで登場したコードの断片をもう一度見てみましょう。

HBufC* buf = HBufC::NewL(128);
TPtr ptr = buf->Des();
// 中略….
rStream >> ptr ;

 ここの流れは以下のようになってます。

1. ヒープディスクリプタ(128文字分、バイト数では256バイト)を確保し
2. 1で作成したディスクリプタからDes関数を用いて変更可能なポインタディスクリプタを作成し(当然、このポインタディスクリプタがカプセル化する領域と、ヒープディスクリプタがカプセル化する領域は同一)
3. ストリーム演算子を用いてポインタディスクリプタに対してデータを代入する

今回の終わりに当たって

 今回は簡単なファイルアクセスの方法とディスクリプタについて触れました。今回は触れませんでしたが、Series60は組み込みデータベースを持っています。アプリケーションの種類によってはデータベースアクセスを行った方が開発効率が良い場合もあるでしょう。アプリケーションの種類に応じて適宜用いてください。

 また、紙面の関係からSeries60が提供するより先進的なストアやストリームネットワーク、さらにスイズル(Swizzle)については割愛しました。複雑なファイル構造や大きなファイルの読み込みを行うときは、これらの技術項目をあたってみてください。

 後半のディスクリプタについては、若干慣れない部分があるかと思います。しかし、慣れてしまえば簡単ですので、いろいろサンプルをご自身で書いてみることをお勧めします。次回はグラフィックスの処理について解説する予定です。
posted by シンビアン at 16:50| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする

オブジェクトの入出力(ストリームの利用)

バイト単位の入出力ではなく、より抽象度の高い入出力を実現するために、C++ではストリーム演算子が提供されています。Series60でも同様のストリーム演算子が提供されており、Unicode文字列の入出力などはこのストリームを用いたほうがより簡単に行うことができます。

 このストリームを用いた入出力はRFsクラスを用いてRWriteStream とRReadStreamを作成することで実現できます(特に、書き出す対象がファイルの場合はRFileWriteStream およびRFileReadStreamになります)。

Unicode文字列のストリームを用いた出力

 ここでは、先のサンプルのコードを書き換え、Unicode文字列の入出力が可能なサンプルを見て行きたいと思います(FileTest2.zip)。

 ファイルへの書き出しは次のようになっています。

void CFileTestDocument::WriteFile()
{
RFs& rfs = CCoeEnv::Static()->FsSession();
// ファイルサーバへのセッションを取り出し
RFileWriteStream wStream ;
TInt rst = wStream.Create( rfs,
_L("c:\\temp\\test.txt"), EFileWrite | EFileStreamText );
if( rst == KErrAlreadyExists ){
wStream.Open( rfs,
_L("c:\\temp\\test.txt"), EFileWrite | EFileStreamText );
}

_LIT( KOutputText , "こんにちは" );
wStream << KOutputText ; // ストリームを使っての書き出し
wStream.Close();
}

 先ほどのサンプル(FileTest1.zip)との相違は、RFileを用いるのではなく、RfileWriteStreamを用いているのが一点、次に、

WStream << KOutputText ; // ストリームを使っての書き出し

と、ストリーム演算子(<<)を用いている点。最後に_LIT8マクロではなく、Unicode文字列を生成する_LITマクロを使用している点です。ファイルの読み込みも同様に行っていますので、CFileTestDocument::ReadFile()関数をご参照ください。

ストリーム演算子とExternalizeLとInternalizeL関数

 FileTest2.zipでは、Unicode文字列の読み込みと書き込みを行いました。これに対して、プログラマ作成の任意のオブジェクトをストリーム演算子を用いて書き出す場合、内部的には(C++のテンプレートを用いて)ExternalizeLとInternalizeLの関数を呼び出します。

 つまり、wStream をRWriteStream のインスタンスとすれば、

WStream << someObj;

と、

SomeObj.ExternalizeL( wStream );

は同じ挙動をします。

 ですので、プログラマ作成の任意のオブジェクトに対して、ストリーム演算子を利用したいときは、ExternalizeL関数とInternalizeL関数を用意します。

 もう一点注意が必要な点として、ストリーム演算子が呼び出すExternalizeL関数とInternalizeL関数は最後に「L」がついていることからわかるとおり、リーブを発生します。ですから、ストリーム演算子はリーブを発生する可能性がある点に注意してください。

 組み込みのデータ型に関しては、ストリーム演算子はストリーム演算子のインスタンスがもつ以下のメンバ関数を順次呼び出します。

TInt8 WriteInt8L() ReadInt8L()
TInt16 WriteInt16L() ReadInt16L()
TInt32 WriteInt32L() ReadInt32L()
TUint8 WriteUint8L() ReadUint8L()
TUint16 WriteUint16L() ReadUint16L()
TUint32 WriteUint32L() ReadUint32L()
TReal32 WriteReal32L() ReadReal32L()
TReal64 WriteReal64L() ReadReal64L()

 ここで注意が必要なのが、TInt 型です。TInt型は次のようにtypedef されていますので、データサイズは実行環境に依存します。

typedef signed int TInt;

 ですから、TInt に関してはWriteInt32L() やReadInt32L() などを用いる必要があります。

ファイル入出力を使用する際にリンクするライブラリ

 今回はファイル入出力を用いたサンプルを提供しましたが、ご自身でスクラッチからプログラムを書く場合は、リンクするライブラリを追加する必要があります。そのため、プロジェクトの設定ファイルを変更する必要があります。

 追加が必要なライブラリの例としては、RFileクラスを使用する場合、実装はefsrv.libにあります。また、ファイルへのストリームを使う場合はestor.libに実装が提供されています。

 これらのライブラリはプロジェクトの設定ファイルであるMMPファイルにて、指定する必要があります。具体的には今回お配りしたサンプル(FileTest2.zip)ではFileTest.mmpにて、次のようにestore.libの指定がなされています。ご確認ください。

LIBRARY eikcoctl.lib avkon.lib estor.lib
posted by シンビアン at 16:41| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする

CDirクラスとRFileクラス

CDirクラスとRFileクラス

 CDir クラスはディレクトリを、RFileクラスはファイルを表すクラスとなっています。ディレクトリの操作や、ファイルに対する操作はおのおのCDirクラスやRFileクラスを用いて行います。ここでRFileクラスを用いた簡単なサンプルを見てみましょう(FileTest.zip)。

 このアプリケーションを実行するには、これまでと同様にビルドして、その後に以下のアイコンを探して下さい(画面1)。


 これを実行すると次のような画面が現れます(画面2)。


 [オプション]から[ファイルテスト]を選んでいただきますと、「hello world」という文字をファイルに書き込み、その書き込んだファイルから文字を取り出して出力します(画面3)。


 それでは、このサンプルの重要な部分を見ていきましょう。まずは、ファイルへの書き出しの部分です。

#include
void CFileTestDocument::WriteFile()
{
// ファイルサーバへのセッションを取り出し
RFs& rfs = CCoeEnv::Static()->FsSession();
RFile file ;
TInt rst = file.Create( rfs,
_L("c:\\temp\\test.txt"), EFileWrite | EFileStreamText );
if( rst == KErrAlreadyExists ){
file.Open( rfs,
_L("c:\\temp\\test.txt"), EFileWrite | EFileStreamText );
}
_LIT8( KOutputText , "hello world" );
file.Write(KOutputText, 11 ) ;
file.Close();

}

 ファイルの指定の部分ですが、

"c:\\temp\\test.txt"

この部分で指定しています。筆者の環境で新たにできているはずのtext.txtを探すと、

\Symbian\8.0a\S60_2nd_FP2_J\epoc32\wins\c\temp

にファイルが存在します。エミュレータ上で実行すると、新たにファイルができているはずですので、探してみてください。

補足:筆者の環境では\Symbian\8.0a\S60_2nd_FP2_J\epoc32\winsがエミュレータ上でのファイルシステムのルートになっております。

 ここで、「Series60では、Unicode を基本的に用いる」という話を思い出してください。通常_LITマクロを使用すると、Unicodeで処理がされますが、ここでは明示的に_LIT8マクロを用いて、ASCII文字列を作成しています。

_LIT8( KOutputText , "hello world" );

 ファイルの読み込みも逆の順序で行っています。次にファイル読み込みの関数を見てみましょう。

HBufC8* CFileTestDocument::ReadFile()
{
// ファイルサーバへのセッションを取り出し
RFs& rfs = CCoeEnv::Static()->FsSession();
RFile file ;
HBufC8* buf = HBufC8::NewL(128);
TPtr8 ptr = buf->Des();
TRAPD( error ,
User::LeaveIfError(
file.Open( rfs,
_L("c:\\temp\\test.txt"), EFileRead | EFileStreamText ) ); );
if( error != KErrNone ){
User::Leave(error);
}
TRAP( error ,
User::LeaveIfError( file.Read( ptr, 128) ); );
if( error != KErrNone ){
User::Leave( error );
}
file.Close();
return buf ;
}

 ここでは、ヒープディスクリプタ(HBufC8)を宣言し、そこにファイルから読み取った内容を書き込んでいます。特に、HBubC8からTPtr8を取り出している点に注意してください。ディスクリプタについては後で説明します。

上記サンプルの注意点

このサンプルではRFileクラスを用いてASCII文字列の入出力を行いました。通常Series60では文字列はUnicodeなのですが、 RFileクラスが持っているReadやWriteなどのメンバ関数はバイト単位の入出力しかサポートしておりません。なので、本来はバイナリデータの入出力でこれらの関数を使うことが多いと思いますが、今回はサンプルのわかりやすさから文字列の入出力を行っています。
posted by シンビアン at 16:35| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする

Symbian(Series 60)上でのC++によるアプリケーション開発

Symbian OS上の代表的なAPIを用いて、Series 60上でアプリケーションを構築する際に必要な知識を習得します。
実際にSeries 60対応の携帯端末を使った環境で演習を実施します。
Symbianとは、Series60上での開発とはを効率よく学べる3日間です。
本コースはNokia(ノキア)社の認定トレーニングコースです。

期間

3日

時間

10:00〜17:00

定価

\189,000

前提条件

●C++で開発経験がある方
対象者

●Symbian OSおよびSeries 60上でのアプリケーション開発に興味をお持ちの方
 
コース内容

●SymbianとSeries 60
●Series 60 SDK
●Simbian OSの基本
●メモリ管理
●ディスクリプタ
●アプリケーション構造の概要
●リソースファイルとローカライズファイル
●UIコントロール
●クライアント/サーバフレームワーク
●アクティブオブジェクトフレームワーク
●Series 60 UI概要
●グラフィックス
●データ永続性
posted by シンビアン at 16:34| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

ファイル入出力とディスクリプタ

アプリケーションを作成する場合、どうしてもファイルアクセスは必須の項目になります。今回はまず、簡単にSeries60上でのファイルアクセスを見ていきます。また、ファイルの入出力ではどうしてもデータの格納先になるデータ領域が必要です。 Series60ではデータ領域をディスクリプタとして抽象化することが可能です。ディスクリプタは今回の後半で見て行きます。
ファイルサーバ

 ファイル入出力の話をする前に、ファイルサーバの話をする必要があります。これまでも述べたとおり、Symbian OSはマイクロカーネルを採用しています。したがって、OSが提供すべきサービスの多くはサービスを代行するサーバアプリケーションによって担われます。

RFsクラス

 ファイル関連の操作の場合、ファイルサーバへのクライアント側の窓口はRFsクラスになります。このRFsクラスを用いて以下の操作を行います。

1. ファイルサーバへのセッションを確立する。
2. ファイルサーバへ、ファイル関連の要求をRFsクラスを通して行う。
3. 必要がなくなった時点でセッションを閉じる

 ファイルサーバへのセッションを確立するには、一般に次のようなコードを用います。

RFs fsSession;
// ファイルサーバへのセッションを確立
User::LeaveIfError(fsSession.Connect());
// ここで何らかの処理を行う。
fsSession.Close(); // 不必要になった時点でセッションを閉じる

 また、ファイルサーバへのセッションが残っている間にリーブが発生すると、セッションを閉じないままアプリケーションが終了する可能性があります。そこで、RFsクラスのインスタンスをクリーンアップスタックに積む必要がありますので、その時は、

CleanupClosePushL(fsSession);

とすれば、リーブ発生時にdeleteされる前にClose関数もあわせてコールされます。さらに、クリーンアップスタックからのポップとオブジェクト自体の削除を行いたければ、

CleanupStack::PopAndDestroy();

を呼び出すことで可能です。PopAndDestroyを呼び出すことで、セッションのCloseもあわせて行われます。

 また通常のアプリケーションであれば、上記の様に明示的にファイルサーバへのセッションを作成することなく、アプリケーション実行環境が用意しているデフォルトのセッションがあります。リソースの使用量などから、特に理由が無い限りはこのデフォルトのセッションを使うことをお勧めします。デフォルトのセッションは、

RFs &fs = CCoeEnv::Static()->FsSession();

と、することで取得できます。

 FRsクラスが提供する機能としては、主に以下のものがあります。

1. ファイルを表すRFileクラス、およびディレクトリを表すCDirクラスのインスタンスの取得
2. ディレクトリの作成や、ファイルおよびディレクトリの削除などの機能

posted by シンビアン at 16:31| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする

非同期の処理

アクティブオブジェクトによる非同期イベントの待機

 次に、メニューの[タイマーのスタート]を選択することにより、アクティブオブジェクトが非同期(ここでは1秒おき)にイベントを受け取ります。そのため、非同期イベントの発生源となるタイマを設定しますが、これはCActiveTest::After()関数で行われます。

void CActiveTest::After(){
iIsRunning = ETrue;
iTimer.After(iStatus, 1000000); // タイマのスタート
SetActive();
//このアクティブオブジェクトがスケジューリングの対象であることを示す
}

 ここで注目していただきたい点として、2点挙げます。

 まず1点目は、iTimer.After関数の第一引数に渡されるiStatusメンバです。このiStatusメンバはCActiveクラスで定義されているもので、非同期のイベントの完了を表すフラグです。iTimer.After関数は第二引数で指定した時間が経過すると、このiStatusの値をKErrNone(つまりKrequestPending以外の値)に設定します。先に述べたアクティブスケジューラの挙動とあわせて確認してください。

 2点目としては、この関数の一番最後に呼び出されているSetActive()関数です。この関数も、アクティブスケジューラに対して自身が非同期のイベントの通知を待っていることを表すために用います。

非同期イベントの通知

 タイマで設定した時間が過ぎ、エラーが発生していなければ、先に登録したアクティブオブジェクトのRunLの関数が呼び出されます。今回は(大まかですが)1秒置きにこのRunL関数が呼び出されますので、このRunL関数でラベルの書き換えを行っています。

void CActiveTest::RunL()
{
After();
sec ++ ;
if( sec >= 60 ){
sec = 0 ;
min ++ ;
}
if( min >= 60 ){
min = 0 ;
hour ++ ;
}
TBuf<32> text;
_LIT(KTime, "Time %d[h]%d[m]%d[s]");
text.Format(KTime, hour, min, sec );
label->SetTextL(text);
iContainer->DrawNow();
}

 ここで、CactiveTest::After()関数を呼び出しているのは、繰り返し1秒後にタイマから通知を受ける必要があるからです。

非同期のイベント待機のキャンセル

 イベント待機のキャンセルが行われた時の処理は、DoCancel関数に記述します。ここでは、RTimerクラスを用いて1秒置きのイベントを受け取っていますので、このリソースクラスに対してタイマのキャンセルをする必要があります。

void CActiveTest::DoCancel()
{
iTimer.Cancel();
iIsRunning = EFalse;
sec = min = hour = 0 ;
label->SetTextL(_L("タイマ停止"));
}

 また、CActiveクラスのデストラクタの中ではCansel関数を呼び出していますが、この関数はそのままDoCancel関数を呼び出します。

CActiveTest::~CActiveTest()
{
Cancel();
iTimer.Close();
}

最後に

 今回は、アクティブスケジューラとアクティブオブジェクトの二つを見ていきました。特にアクティブオブジェクトはコーディング量も若干多くなると思います。今回は処理ロジックをそのままRunL関数に書き込みましたが、再利用を考えると、何らかのコールバックを登録、RunLで登録したコールバックを呼び出せば汎用性が上がると思います。次回はファイル入出力について見ていく予定です。
posted by シンビアン at 13:55| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする

アクティブオブジェクトを用いたタイムカウンタアプリケーションのサンプル

それでは、アクティブオブジェクトと用いたサンプルとして、簡単なタイムカウンタのアプリケーションを見ていきましょう。このサンプルプログラムは、並行処理が必要なプログラムとなっています。バックエンドではタイマーの処理を、フロントエンドではユーザーからの操作を受け付けています。[activetest.zip]

 今回のサンプルも、前回以前と同様にダウンロードしてビルドしますと、次のようなアイコンが追加されます(画面1)。


 このアプリケーションを起動し、次に[オプション]から[タイマーのスタート]を選択すると、下図のような画面が現れて1秒ごとに時間経過をカウントしていきます(画面2)。


 さらに、[オプション]から[タイマーの停止]を選択すると次のような画面になり、タイマを停止します(画面3)。


 先ほども述べたとおり、Series60ではマルチスレッドのアプリケーションは推奨されていません。今回のサンプルでは、この1秒おきの通知をアクティブオブジェクトで受け取り、スレッドはあくまでも一本になります。

アクティブオブジェクトの作成と登録まで

 次に、アクティブオブジェクトの作成と登録までを見ていきましょう。先ほど述べた通り、アクティブオブジェクトは必ずCActiveクラスを継承して作成されます。今回のサンプルでは、アクティブオブジェクトとなるクラスは次のように宣言されたCactiveTestクラスになります。

class CActiveTest:public CActive
{
public:
CActiveTest(); // コンストラクタ
~CActiveTest(); // デストラクタ
void ConstructL(CEikLabel* ,
CActiveTestContainer*); // 第二フェーズコンストラクタ
void After(); // タイマー開始関数
TBool IsRunning();
void RunL(); // コールバックの関数
void DoCancel(); // キャンセル時に呼び出される関数
protected: // data
// RTimerのインスタンス
RTimer iTimer;
CEikLabel* label ; // 時間を表示するラベル
/// 以下省略
};

 このCActiveクラスのコンストラクタにおいて、このアクティブオブジェクトの優先度の設定とアクティブスケジューラへの登録が行われています。

CActiveTest::CActiveTest():
CActive(EPriorityStandard)
// EPriorityStandard は優先度が通常のものであることを表す。
{
// 中略
CActiveScheduler::Add(this);
// 自分自身をアクティブスケジューラに追加
}

 先ほども述べたとおり、アクティブスケジューラへの登録はCActiveScheduler::Add関数で行われます。
posted by シンビアン at 13:48| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする

非同期の処理

アクティブスケジューラ

 続いてアクティブスケジューラを見ていきましょう。アプリケーション起動時にフレームワークは、アクティブスケジューラを作成します。また、アクティブスケジューラにアクティブオブジェクトを登録するには、CActiveSchedulerクラスのstatic void Add(CActive* anActive)関数を用います。

 アクティブスケジューラはループで実現されていますが、このループの中では大まかに次の処理がなされています。

1. 登録されているアクティブオブジェクトのうち、優先度上位のものから順番に次の条件を満たすことを確認する。

(1) … CActive::IsActive()がETrueを返す。このことで登録されたアクティブオブジェクトが未処理の非同期イベントの通知を待っていることを表す。
(2) … 上記で待っている非同期のイベントが終了していることを表すフラグであるCActive::iStatusの値がKRequestPending以外の値になっている。

2. 1.で調べた条件を満たすアクティブオブジェクトのRunLの関数を呼び出し、その実行終了を待つ

3. 1.に戻る

 アクティブスケジューラは、キーイベントなどのユーザー入力も処理している点にも注意する必要があります。つまり、アクティブスケジューラが呼び出す関数RunL()は、速やかに終了する必要があるわけです。仮にRunLの関数の実行に数秒かかる場合、アプリケーションは、その数秒間ユーザーの入力を受け付けなくなり、ハングしたように見えます。

補足:本稿では説明しませんが、自作のアクティブスケジューラを作成することも可能です。

アクティブオブジェクト

 上記のアクティブスケジューラの説明で見たとおり、アクティブオブジェクトのRunL関数により、非同期のイベントの通知を受けます。また、RunL以外にもiStatusなどの重要なメンバが存在します。これらのメンバはCActiveクラスで定義されており、新たにアクティブオブジェクトを作成する際には、必ずこのCActiveクラスを継承する必要があります。以下にCActiveクラスの重要なメンバとその説明を大まかに記述します。

* RunL():非同期のイベントが終了した際、コールバックとして呼ばれる関数。
* DoCancel():非同期のイベントの待機がキャンセルされたときに呼び出される関数。
* Cancel():オーバーロードしない限りはDoCancel関数を呼び出す。
* RunError(TInt):RunLがリーブした際、例外処理の関数として呼ばれる。
* SetActice():このアクティブオブジェクトが非同期のイベントの通知を待っている状態に設定する関数。
* CActive(TInt aPriority):コンストラクタ。引数にはこのアクティブオブジェクトの優先度を設定する。
* TRequestStatus iStatus :非同期のイベントの状態を表すフラグ。このフラグがKrequestPendingの時は非同期のイベントが完了していないことを表す。

posted by シンビアン at 13:46| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする

2006年02月14日

シンビアン、スマートフォン向けの新OS「Symbian OS v9」をリリース

Symbianが米国時間2日、スマートフォン向けのオペレーティングシステム(OS)「Symbian OS v9」をリリースした。同OSは、セキュリティが強化され、より柔軟なカスタマイズが可能になったほか、企業ユーザー向けの機能が追加されているという。 Symbian OS v9を搭載するスマートフォンは2005年後半に発売される予定。

 2日朝、同社のマーケットコミュニケーション担当バイスプレジデントPeter BancroftはZDNet UKに対し、同OSを採用することで、メーカーはよりニッチなユーザー(モバイルワーカーやゲーマー、マルチメディアサービスをしばしば利用するユーザーなど)を意識した端末を開発できるようになると述べた。

 Intelは昨年10月、Symbianの3G端末に対応したプラットフォームを開発中であると明らかにしたが、BancroftはこのプラットフォームとSymbian OS v9に相互運用性があることを認めた。

 注目が高まりつつあるニッチ市場の顧客を囲い込む目的で、メーカー各社は端末の差別化に力を入れている。しかし、だからといって、市場が新しいユーザーインターフェースであふれかえることはないだろうと、Symbianは考える。その理由についてBancroftは、費用と時間を考えると新しいユーザーインターフェースの開発研究は誰にでも気軽に手を出せる分野ではないからだと述べる。だが同氏は、「市場で何が起きるか、誰にも予測できない」とも付け加える。

 Symbian OS v9にはデバイスマネジメント機能が搭載されているが、これは携帯電話会社や企業のITスタッフがスマートフォンをリモート管理するのに役立つという。具体的には、この機能を利用して、リモート環境から問題点を分析したり、新しいアプリケーションをインストールしたり、インストール済みのアプリケーションの動作を確認したりすることができる。

 Bancroftは、「携帯電話端末が多くの機能を持つようになるのは、素晴らしいことだ。だが、機能が充実すればするほど、サポート費用も高くなることに留意してほしい」とくぎを刺す。

 企業ユーザーを視野に入れて強化された機能はほかにもある。例えば、携帯機器から電子メールへのアクセスを効率化するプロトコルInternet Message Access Protocol(IMAP)のサポートが改良されている。またSymbian OS v9では、Lotus NotesやOutlookのグループスケジューリング機能を利用できるので、社外でも打ち合わせを調整することが可能になるという。
posted by シンビアン at 20:25| Comment(0) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

英Symbian,スマートフォン向けOSの新版「Symbian OS version 9」を発表

英Symbianが,スマートフォン向けOSの新版「Symbian OS version 9」を英国時間2月2日に発表した。マルチメディア/セキュリティ/管理機能などの強化を図った。また,「大量販売される安価な携帯電話機も同OSの対象に含める」(Symbian社)としている。

 Bluetoothステレオ・ヘッドセット,大容量USBストレージ,高度なオーディオ再生,MPEG,OMAのデジタル著作権管理(DRM)などに対応し,マルチメディア機能を高めた。数100Mピクセル・クラスのカメラ付き携帯電話機のプラットフォームとしても利用できるという。サイズや向きの異なる画面,複数画面も処理できる。

 OMA準拠のデバイス管理ソリューションを使用すると,新しいネットワーク・サービス/機能/アプリケーションの導入,障害診断,導入済みアプリケーションの監査が,遠隔地から行える。セキュリティ面も強化し,携帯電話機内の重要情報が悪質なプログラムにアクセスされるのを防ぐ仕組みも導入した。

 IMAPサーバー上の電子メールをフィルタリング/ソートする機能を強化したほか,Lotus NotesやMicrosoft Outlookの予定表機能との連携も可能にした。携帯電話機向けJavaガイドラインJava Technology for the Wireless Industry(JTWI:JSR 185)とPersonal Information Management(JSR 075)に対応しており,Javaベースのアプリケーションやサービスを利用できる。

 新版を搭載した携帯電話機は,2005年後半に利用可能となる見込み。
posted by シンビアン at 20:24| Comment(0) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

最新Symbian OS搭載のスマートフォン、ソニエリが発表

Sony Ericssonの新端末「P990」はSymbian OS 9.1とUIQ 3ソフトプラットフォームを搭載し、Wi-Fiネットワークにも対応。ユーザーはOpera 8でWebサイトを閲覧できる。(IDG)

 来年第1四半期に、Sony Ericsson Mobile Commnunicationsは、Symbian OS 9.1とUIQ 3ソフトプラットフォームを搭載した初のスマートフォンを発売する。同社が10月10日、明らかにした。

 この発表と同日に、Symbianの子会社UIQ Technologyは最新版ソフトプラットフォームUIQ 3向けのSDK(ソフト開発キット)を発表した。UIQ 3はSymbianをベースとしており、開発者はこれを使うと、UIQに対応した各社のスマートフォンで動作するアプリケーションを開発できる。携帯電話開発者は、それぞれの端末向けにアプリケーションを書き直したり、調整しなければならないことが多い。UIQプラットフォームはそうした作業を取り除くことを目指している。

 このSDKは、UQIの開発者コミュニティープログラムに登録し、Smartphone Showに参加した500人の開発者に提供される。Smartphone ShowはSymbianの年次カンファレンスで、10月11日から12日までロンドンで開催される。このSDKの最終版は、UIQの開発者プログラムサイトで10月26日からダウンロード提供される。

 Sony Ericssonの新端末「P990」は最新のSymbian OSを走らせるほか、UMTSとWi-Fiネットワークに対応し、2メガピクセルカメラを搭載する。ユーザーはOpera 8でWebサイトを閲覧できる。80Mバイトの内蔵メモリと64Mバイトのメモリースティックを備え、また別売りの4Gバイトメモリースティックも利用できる。

 Sony Ericssonは発表文で、発売前にこの端末を発表したのは、この端末が発売されてすぐに使えるアプリケーションを構築する時間を開発者に与えるためだと述べている。開発者はC++またはJavaでプログラムを構築できる。

 同社はこの端末をSmartphone Showで展示する予定だ。
posted by シンビアン at 20:14| Comment(1) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

スマートフォンをマス市場へ──SymbianとNokia

Symbian OS v9.0を投入したSymbianは出荷倍増中。2008年には1台当たりの開発コストが78ドルになり、全携帯電話の25%がスマートフォンとなるという。

 スマートフォン分野のキーワードは“マス市場”となった。2月14日、仏カンヌで開催したモバイル最大規模のイベント「3GSM World Congress 2005」にて、英SymbianとフィンランドのNokiaはそれぞれプレス向けに発表会を開催、マス市場へ向けた戦略を語った。

Symbian OS v9.0でOS強化

 Symbianが2月2日に発表した最新の携帯端末向けOS「Symbian OS v9.0」は、セキュリティ、デバイスの管理機能などを強化し、スマートフォンのマス市場への普及を意識している(2月3日の記事参照)。コアとなるプラットフォームの上に、端末メーカーやオペレータが特定セグメント向けに機能を追加できるレイヤーを持つ。セグメントとしては、エンタープライズ、音楽、ゲームなどを想定している。

sym2.jpg
 SymbianのCEO、デビッド・レビン氏はこの日、Symbianの現状を報告した。2004年出荷されたSymbian OS端末は1438万台。年間平均成長率は115%で、4四半期連続で出荷台数倍増を達成したという。まさに倍倍ゲームでユーザーを増やしている状態だが、スマートフォン自体の市場のパイはまだまだ小さい。2004年第4四半期のスマートフォン出荷台数は568万台。同期、世界で出荷された携帯電話の台数は1億9500万台程度といわれている。

 マス市場に向けた取り組みはOSの強化だけではない。米Texas Instrumentsや米Intelとレファレンスデザインを設計し、コスト削減、早期市場投入を手助けしている(10月6日の記事参照)。この日、同社は日立製作所と三菱電機の半導体分野の合弁会社、ルネサス テクノロジとも提携を発表(2月14日の記事参照)。ルネサスの3G端末向けプラットフォームにSymbian OSをポーティングすることで、開発工期を短縮できるとしている。

Series 60 3rd Editionも発表

 そのSymbian OSにおけるUI(User Interface)の1つが、Nokiaの「Series 60」だ。Nokiaはこの日、最新のSymbian OS向けに「Series 60 3rd Edition」を発表。OSと足並みを揃えた。

sym3.jpg
 Symbian OSのUIはほかに、Ericssonの出資を受けるスウェーデンのUIQ Technologyもある。OSとしてMicrosoftやLinuxと競争するだけでなくUI間でも競争がある。Nokiaのモバイルソフトウェア・セールス&マーケティング副社長、アンティ・バサラ氏はこの日、「音楽、ゲームに代表されるマス市場と、これまで通りのハイエンドの2方向アプローチをとる」と戦略を明かした。
※アンティ・バサラ氏の会社名が謝っておりました。お詫びし、訂正させて頂きます

 中でもカスタマイズ化はオペレータ、端末メーカーからの需要が高い部分で、ここへのフォーカスがSeries 60の差別化ポイントとなる。カメラなどイメージング、ビジネス、音楽、ビデオ、ゲームなどのカテゴリに対応する。例えば、イメージングでは高機能マルチメディアレンダリングを実現し、ビジネスではQWERTYキーをサポート。音楽ではOMA DRM 2.0によるダウンロードが実現できるほか、カスタマイズ可能な音楽再生プレイヤーをビルトインで提供する。

 Nokiaは先立って米Macromediaと提携、その一環としてFlashライセンスを取得しており、Series 60端末でFlashが利用できるようになった(2月12日の記事参照)。海外でもFlashはコンテンツプロバイダの注目を集めており、開発者にメリットがありそうだ。

 「Series 60 3rd Edition」は、今年中ごろにライセンス提供を開始する。最初の端末は年内に発表の予定で、ビジネス向けの端末になりそうだという。
2008年、25%はスマートフォンに

 Nokiaでは、2005年2月末でSymbian OS/Series 60ベースのスマートフォンの総出荷台数は2000万台に達すると見込んでおり、2008年、全携帯電話のうち25%がスマートフォンになると予測している。この日、中国のLenovoと英Sendoが、Series 60ベースの端末を発表している。

 Symbian OS全体としては、2004年末時点でライセンス先6社から41機種が提供されており、12社が計40端末を開発中。国内メーカーでは、NTTドコモ向けに富士通、三菱。また海外向けにパナソニックらがSymbian OS搭載端末を提供しており、昨年末にはシャープがこれに加わった(2004年7月8日の記事参照)。

 現在スマートフォンでは最大のシェアを持つのはNokiaだが、日本メーカーの貢献は大きい。レビンCEOは、2003年に「F2051」でSymbian端末を初投入し、以降、テレビ電話機能の「F2102V」、指紋認証機能を搭載した「F900i」や“らくらくホン”、FeliCa搭載の「F900iC」と多岐にわたる端末を投入した富士通を挙げた。

 では、いつスマートフォンはマス市場に浸透するのだろうか? SymbianのレビンCEOは、「素地はすでにある。あとはコストの問題」との見解を示した。「素地」とは、現在世界に出回る携帯電話の80%を供給するメーカーが、すでにSymbian OSのライセンシーとなっているからだ。コストでは、コアの部分でレファレンスデザインや共通セットを利用することで削減につながり、より戦略的な部分となる機能拡張差別化の部分に充当できることになる。

 同社では、2008年には1台当たりの開発コストが78ドルになると試算しており、このあたりが転機になると見ているようだ。
posted by シンビアン at 20:12| Comment(0) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

Sony Ericsson、Symbian採用のスマートフォンにメモリースティックDuo搭載

Sony Ericsson Mobile Communicationsは、すでにアナウンス済みのGSM携帯電話「P800」に、メモリースティックDuo(以下Duo)スロットを搭載することを発表した。

P800は、3月にすでに発表されていたもので、今回、詳細なスペックが明らかになった。大きな特徴はDuoに対応した点。日本でもDuo対応端末が7月に登場することが明らかにされているが、正式なアナウンスとしては「世界初ということで間違いない」(同社日本法人広報)。容量は16MBのものが同梱され、PCとの各種データ交換や端末のデータをバックアップすることができる。MP3プレイヤー機能も搭載されており、Duo、または端末に保存した MP3ファイルを再生して、付属のステレオイヤホンで楽しむことができる。

デジタルカメラも内蔵されており、撮影画像やPCから転送した画像データをスクリーンセーバーとして利用したり、フォトライブラリーに保存したりできる。内蔵メモリは12MBで、付属の16MBのDuoと合わせ、28MBのユーザーメモリが提供され、十分にデータを保存できる。データの転送は、 Duoだけでなく、Bluetooth、赤外線、ケーブル、と多彩な方式に対応している。

Sony Pictures Digital Entertainmentが提供する、7月公開の「Men In Black II」のゲームが楽しめるのも特徴。映画に登場する武器でエイリアンを倒す射撃ゲームだ。

OSにはSymbian OS v7.0を搭載、UIQと呼ばれるペンで操作するインタフェースを採用していたPDAタイプの端末だ。ストリーミングのメディア再生にも対応、Wordや ExcelといったMicrosoft Officeのデータの編集・閲覧もできる。BluetoothによるPCとのデータ同期も可能だ。

Webは、HTML、XHTML、cHTML、WAPなどの表示に対応し、欧米やアジアにおけるGSM 900/1800/1900のエリアで利用できる。また、中国語バージョンの「P802」も提供される。発売はともに第3四半期の予定。残念ながらGSM 方式のため日本では利用できない。同社日本法人は同様の端末の開発予定はない、とするが、Symbian OS v7.0はCDMA方式にも対応していることもあり、日本での開発も期待したい。
posted by シンビアン at 20:11| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

Sony Ericsson、動画対応のSymbian搭載スマートフォン「P900」を発表

Sony Ericssonは、GSM/GPRSをサポートするスマートフォン「P900」とカメラ内蔵携帯電話「T630」を発表した。それぞれ「P800」と「T610」の後継機種となる。米国、ヨーロッパ、アジア地域向け製品で、2003年第4四半期から2004年第1四半期にかけて発売される予定だ。

P900は、OSにSymbian OS v7.0が採用されている。本体背面にカメラを装備しており、VGA (640 x 480) サイズの静止画、QCIF (176×144) サイズのMPEG4ビデオを撮影できる。

わずか2回のボタン操作で撮影が可能になるなど、操作性の高さが特徴の一つとなっている。機能選択用の5方向ジョグダイヤルのほか、文字入力用にUIQと呼ばれるペン入力ユーザインターフェースを搭載。さらにグラフィカルなインタフェースが、写真やビデオの共有やマルチメディアメッセージの送信をサポートするQuickShare機能を備える。データの転送には、Bluetooth、赤外線、USB接続などが利用できる。

ダイヤルボタン部分を開くとワイドスクリーン・モードに切り替わるデザインに変更はないが、ディスプレイがP800の4,096色から65,536色表示に向上した。内蔵メモリは48MB、さらにメモリースティックDuoスロットを備える。内蔵ブラウザはHTML、WAP、cHTMLなどをサポートする Operaが採用されている。メディアプレイヤーは、静止画/動画以外にMP3の再生をサポートしている。

一方、T630はテクノロジに対する関心は高いが安定した機能を使いたい20代から50代のユーザー層をターゲットにしている。ストレート型のコンパクトな本体に6万5000色表示のカラーディスプレイ、カメラ、Bluetooth機能を搭載し、 QuickShare機能も利用できる。
posted by シンビアン at 20:10| Comment(0) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

「2010年まで『Symbian OS』がスマートフォン市場をリード」,米ABIの調査

「2010年までは,英SymbianがスマートフォンのOS市場で優勢を維持するだろう」。米ABI ResearchがスマートフォンOS市場の今後の展望について調査した結果を,米国時間4月26日に発表した。

 Symbian社のこれまでの成功は,米MicrosoftによるスマートフォンOS市場の独占を回避しようと,Symbian OSを支持したハンドセット・メーカーやキャリアに負うところが大きい。しかし,フィンランドのNokiaがSymbian社に出資を行っていることから,Nokia社の勢力増大を懸念する向きもある。現に,Nokia社の最大の競争相手である米Motorolaは,同社が保有していたSymbian社の株式を売却して,Microsoft社の「Windows Mobile」を移行しているという。

 スマートフォンOS市場では現在,メーカー独自のOSが98%を占めている。約1000万台に相当する残り2%のシェアを巡って,Symbian社,Microsoft社,Linux開発者がし烈な競争を展開している。

 ABI社は,2009年までに,スマートフォンとWeb対応PDA(携帯情報端末)の出荷台数が,ハンドセット全体の約25%を占めると予測している。また,メーカー独自のOSは機能が限定されているため,より大きなディスプレイや操作性に優れたメニューへの需要が,標準OSに対する需要をけん引するという。
posted by シンビアン at 20:05| Comment(0) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

2006年02月13日

非同期の処理

例えば、Series60を用いてネットワークを用いたサーバアプリケーションを構築するとしましょう。この際、サーバはクライアントからの接続を待つ必要があります。この「接続を待つ」という行為は明確なタイミングがわかっているものではありません。このような場合、通常は別にスレッドを立て、クライアントからの接続を監視させる事を考えると思います。

また、同一アプリケーションで何らかの時間のかかる処理を走らせている間もユーザーの入力は受け付けなくてはいけないという状況はあるはずです。このような場合も普通に考えるのであれば別にスレッドを立てると思います。今回は、上記のような状況を一般に「非同期の処理」と呼び、その処理をSeries60 上で実現する方法を見てみたいと思います。

マルチスレッドは使用しない?

 Series60では、マルチスレッドを用いたプログラムが可能になっております。しかし、ここで紹介する方法は、マルチスレッドの使用方法を説明するものではありません。スレッドはあくまでもメインのスレッド1本です。非同期の処理を実現するのにスレッドを用いないのは「Series60ではマルチスレッドを用いたプログラムが推奨されない」点に理由があります。マルチスレッドを用いることが推奨されない理由としては

* コンテキストスイッチの切り替えなど、マルチスレッドはリソースを多く消費する
* デットロックの回避等、マルチスレッド特有の問題に対処しなくてはならない

などが挙げられます。

 推奨しないからには、スレッドに変わる非同期の処理を行う機構が必要です。これが「アクティブオブジェクト」と「アクティブスケジューラ」になります。

アクティブオブジェクトとアクティブスケジューラ

 アクティブオブジェクトとアクティブスケジューラは、アプリケーションフレームワークの中で使用されるクラスです。各々の詳細を挙げると、

アクティブスケジューラ
各イベントに応じてアクティブオブジェクトのスケジューリングを行う。アクティブスケジューラ は1つのスレッドにつき1つのみ存在できる。
アクティブオブジェクト
アクティブスケジューラから呼び出され、非同期の処理を行う実体であり、コールバックの関数としてRunL()関数を持つ。

となります。

 つまり「アクティブスケジューラは簡単なスケジューリングを提供する。スケジューリングの対象がアクティブオブジェクトになる」と見ることができます。さらに言えば、「Series60のアプリケーションは、SymbianOSが提供するプロセスごとのスケジューリングと同時に、アプリケーションフレームワーク内部でも各スレッドごとにアクティブスケジューラが行うスケジューリングがある」ということができます。
posted by シンビアン at 21:03| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

コンストラクション(Cクラス)

次に、Cクラスのオブジェクトのコンストラクションに話を移しましょう。オブジェクトのコンストラクションに絡めて、クリーンアップスタックについて見ていきます。

 前回の記事でも多少触れさせていただきましたが、クラスのインスタンスを作成する時は通常、「2フェーズコンストラクション」を行います。2フェーズコンストラクションは、具体的には

* new(ELeave)演算子を用いてクラスのインスタンスが必要とするメモリを確保する。この新たにオーバーロードされている演算子はリーブを発生させる可能性がある。

* 作成したインスタンスが他のオブジェクトを所有する場合(つまりhas-aポインタを持つ場合)は、概ねConstructLという名前の関数でポインタの参照先インスタンスの生成とポインタの値の設定を行う。

 という流れになります。若干厄介に見えますが、これはメモリリーク対策になります。またまた繰り返しになりますが「メモリの確保が最もリソース不足によるエラーを起こしやすい」に注意してください。

 それでは、次の図を見てください。


 携帯環境ですから、非常にリソースが限られています。ですから、小さなオブジェクトの確保でも失敗をする可能性があるわけです。もし、上記のようなコードで、ptr2の初期化に失敗する可能性を考えるのであれば(これは携帯環境では十分に考えられる)、各々のポインタに対して、nullチェックを行う必要があります。これでは、プログラムを書くのが手間になってしまいます。また、リーブの機構があるのですからこれを使わない手はありません。

 そこで、例外処理をすっきりさせるため、先ほど出てきたリーブの仕組みを使うことを考えます。つまり、new(ELeave)を用いてメモリの確保を行います。このオペレータは先述の通り、メモリ確保に失敗するとリーブを発生させます。

 この場合、例外処理はすっきりしますが、新たな問題を引き起こします。それでは、次の図を見てください。


 つまり、リーブが発生した時点でTRAPマクロやTRAPDマクロで処理される箇所までスタックを遡るわけです。2回目のnew(ELeave)でリーブが発生した場合、ptr1が一時的な作業用のauto変数(コンストラクタの中であったとしても十分にあり得る)であれば、そのポインタが永遠に失われ、結果としてメモリリークの原因になります。

 そこで、次のような対策を講じます。

1. CBaseクラスを継承したクラス(ClassA)の使用するメモリのみを確保する(コンストラクタでは何も行わない)。メモリの確保に失敗すれば、リーブを発生させる。

2. ClassAによって所有される他のクラス(has-aポインタでの参照先)は、他のコンストラクション用の関数(一般にConstructL)で初期化する。ここでもリーブが発生する可能性がある。

3. 1または2でリーブが発生した場合、構築途中のオブジェクトへのポインタが失われないようにグローバルな領域(スタック)にポインタの値をコピーしておく(このスタックをクリーンアップスタックと呼ぶ)。

 それでは、2フェーズコンストラクションのサンプルを見てみましょう(Construction.zip)。このサンプルでは、自前でCBaseクラスから派生をしたCMyObjクラスを作成し、このクラスが2フェーズコンストラクションを行います。ただし、意図的にConstructLの関数内でリーブを発生させてる点に注意してください。

 サンプルをビルドしたのち、下記のアイコンのアプリケーションを実行します。


 すると、次のような画面が現れます。


 その後、メニューから「テスト」を選択します。ここでは意図的にリーブを発生させていますので、次のような画面が現れます。


 最後に次のような画面になります。


 ここで、今回のサンプルコードの重要な部分を確認しておきましょう。

CMyObj* CMyObj::NewL(CConstructionContainer* aContainer )
{
CMyObj* ptr = new(ELeave)CMyObj; // インスタンスが使用するメモリの確保
CleanupStack::PushL( ptr );
// (1)以下の処理でリーブが発生したときに備えクリーンアップスタックにpush
ptr->ConstructL(aContainer); // インスタンスのメンバの初期化
CleanupStack::Pop();
// リーブの可能性がなくなったので、クリーンアップスタックからpop
return ptr ;
}

void CMyObj::ConstructL(CConstructionContainer* aContainer)
{
this->iContainer = aContainer ;
TInt reason = KErrNoMemory; // 勝手にメモリがないことにする
User::Leave(reason); // リーブを発生(2)
aContainer->UpdateMessage(_L("初期化完了") ); // この行は実行されない
}

CMyObj::~CMyObj()
{
this->iContainer->UpdateMessage(_L("CMyObj 削除完了"));
}

 ここでは(1)にて構築途中のオブジェクトをクリーンアップスタックにプッシュし、第二フェーズのコンストラクションの(2)において意図的にリーブを発生させています。ここでクリーンアップスタックの重要な動作として、

リーブが発生したとき、クリーンアップスタックに詰まれた
全てのオブジェクトのデストラクタが呼び出される

という点に注意してください。つまり、2フェーズ目で構築に失敗し、リーブが発生しても、クリーンアップスタックにメモリ確保時に取得したポインタを積んでおけば、自動的にデストラクタが呼び出されるということです。そして、リーブ時にデストラクタを呼び出すためにCBaseクラスに仮想デストラクタが定義されているわけです。今回のサンプルコードの画面遷移でも、デストラクタが呼び出されていることが確認できると思います。

 ただし注意点として、リーブ発生時にはクリーンアップスタックに詰まれた全てのオブジェクトがデストラクトされます。つまり、

リーブが発生する可能性が無くなった時点でクリーンアップスタックから取り除く

必要があります。将来、全く別の理由でリーブが発生した場合、問題のないオブジェクトまでデストラクションする可能性があるためです。

次回の予定

 次回は、非同期の処理を見て生きたいと思います。Series60でもスレッドの利用は可能ですが、リソースの消費用の大きさから異なるフレームワークを使用します。この点について確認していく予定です。
posted by シンビアン at 20:58| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。