2006年02月15日

非同期の処理

アクティブスケジューラ

 続いてアクティブスケジューラを見ていきましょう。アプリケーション起動時にフレームワークは、アクティブスケジューラを作成します。また、アクティブスケジューラにアクティブオブジェクトを登録するには、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プログラミングテクニック | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/13315476

この記事へのトラックバック
×

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