- - PR -
前回の「並行処理の奥義、非同期フレームワークとは?」に引き続き、Symbian OSにおける非同期フレームワークを解説していきます。
非同期フレームワークは、
- 非同期要求
- 非同期の完了待ち
の2つに対する抽象化を実現するものです。このうち、非同期要求の抽象化については、
- なぜ必要か→ノンブロッキングなプログラミングを自然に行うため
- Symbian OSではどのようなメカニズムで実現されるのか→CActiveの派生クラスで実現
ということを前回説明しました。そこで今回は非同期処理の残り半分、「非同期の完了待ち」について解説していきます。
「非同期の完了待ちなんてどこのOSでもやってる話だし、別に書きたいように書けばいいんじゃないの? Symbian OSでは非同期処理さえやっておけば性能出るんでしょ。大丈夫、オレ前のOSじゃ非同期をきちんと書いてたんだから、前のスタイルでやらせてよ」−という話を、“マレ”では済まされない頻度で耳にします。残念ですが、こんな態度の人が存在すると、そのプロジェクトは破たんしたも同然です。
今回の目的は、もちろんSymbian OSにおける非同期フレームワークを紹介することにあります。しかし、例えばX Window System由来のコードをそのまま移植しようとする破壊分子がプロジェクトに現れたとき、説得(または撃退)する方法を伝えることも、また目的だったりします。え、実はまさにいま、X Window System由来のコードを移植しようとしているのですか? ……引き返す最後のチャンスです。よく注意して読んでください。
一般論としてのウェイトループ
ここでもう一度非同期処理のAPIシーケンスを考えてみます。
![]() |
| 図1 非同期型APIのシーケンス図 |
図1のシーケンス図はプログラムが動いている状態の図(UMLでいう「振る舞い図」)です。では、この動作を満たすプログラムはどんな形になるでしょうか。
複数の非同期要求の完了を、1回の関数発行で待つことができるAPI(以下、完了待ちAPI)が提供されているとします。すると、図1のクライアント側の動作を行う、最もシンプルなコードは以下のように構成できます。
while ( 1 ) { |
| 図2 完了待ちの抽象コード |
上記のコードでは、WaitForAnyRequest()が完了待ちAPIになります。この関数の名前などディテールの差異を除けば、この形のプログラムはそれほど奇抜な話ではありません。というより、Win32APIを生でたたいたことがある人や、X Window Systemのプログラムを書いたことがある人には、おなじみのスタイルのコードであるはずです(注1)。
ほかからのイベント(注2)が届くまで何らかの方法で待ち、届いたイベントに対するハンドラを呼び出す。それをプログラムが終わるまで繰り返す。このようなスタイルのコードをウェイトループといいます。非同期に到着したイベントを各ハンドラに振り分けるための、基本的な概念として知られています。基本的な概念? そう、ウェイトループをそのまま実装するには問題があるのです。
| 注1:Win32やX Window Systemの場合、else ifではなく、switch caseによる判定が一般的です。これは完了待ちAPIが一度に1つの完了しか拾わないことによります。このあたりはOSごとのデザインの差の部分です。ちなみにSymbian OSでは複数のイベントが同時に到着している可能性があるので、優先順位に従ってelse ifでイベントの判定を行うことになります。とはいっても、一度のWaitForAnyRequest()で処理してよいのは、1つの完了通知だということも申し添えておきます。 注2:Symbian OSにおける非同期要求に対する完了通知も、広義のイベントに含まれます。 |
関連記事 設計/開発技法
- 特集:Javaは組み込みに“不向き”は本当か?
- 連載:BREWアプリケーション開発入門(全10回)
- 連載:イチから作って丸ごと学ぶ! H8マイコン道(全12回)
- 連載:−ザ・組み込み−ソフトウェアのハードウェア化(連載中)
- 連載:組み込みLinux開発入門(全3回)
- 連載:T-Engineプログラミング入門(全4回)
- 連載:Symbian OS開発の勘所(全10回)
- 連載:Symbian OSアプリ開発の手引き(連載中)
- 連載:解説! ロボット開発環境Robotics Studio(全4回)
- 連載:Robotics Studio活用術 はじめて作るサービス(全5回)
- 連載:生産性向上への道 Eclipseで行うC/C++開発(全4回)
組み込み開発フォーラム 新着記事
- フルスクラッチの“Hello World”を動かしてみよう(2011/3/31)
- FlexRayプロトコルの概要(その2)(2011/3/29)
- JASA、東北地域に拠点を置く会員企業を支援(2011/3/25)
- NEC、震災の影響を受けた4拠点の生産再開を発表(2011/3/23)
- 内部ブロック図の基礎と共通要素(2011/3/22)
- インテル、被災地におけるITインフラの復旧を支援(2011/3/22)
- Facts on AUTOSAR/AUTOSAR導入の現実(2011/3/18)
- 計測器・震災被害ホットラインを開設、テクトロニクス(2011/3/18)
- ZMP、地震の揺れを多角的に計測するアプリ無償配布(2011/3/16)
- メンター、3Dテレビ・マルチメディア検証プラットフォーム(2011/3/16)
- 【番外編】タチの良い計測値、悪い計測値とは?(2011/3/15)
- tarファイルシステムをAndroidに組み込む!!(2011/3/10)















