[openrtm-users 00126] コンポーネント内での不定期イベント待ちの方法について

Masayuki Shimizu masayuki.shimizu @ aist.go.jp
2007年 5月 31日 (木) 22:30:04 JST


こんにちは

産総研 清水です.

コンポーネントのonExecute()内で,
不定期に発生するイベントを待たなければいけないとき,
どのようにするのがよいのか,
どなたか良い方法をご存じないでしょうか?

onExecute()は,遅延なく周期的に実行されなければならないため,
その中では,sleepやwaitなどの処理をブロックするものは,
原則,許されません.しかしながら,SimpleIOのConsoleInのように,
キーボード等の外部デバイスを介してオペレータの指令を受け,
それを基に,何かの処理を開始するというようなことをしたい場合,
すなわち,イベントドリブン方式の処理をコンポーネントにさせたい場合,
不定期に起こるイベント(オペレータの指令)を
onExecute()内で待ち受ける必要があります.

しかしながら,当然のこと,そのイベントは起こらないこともあるので,
そのような時は無限に待ち状態になってしまい,
実行コンテキストの処理が永遠にブロックされてしまうので,
コンポーネントの操作すらできなくなってしまいます.

理想的には,実行コンテキストの周期を制限時間としてイベントを待ち,
制限時間内にイベントが起こらなかったら
ブロックを解除して次の周期に進むというのがよいのですが,
デバイスから通知されるイベントをユーザ空間のプログラムから
タイムアウト付きで待つ方法がわかりません.

とりあえずの無限待ちの回避法として,
周期的にデバイスをポーリングするという方法を,
SimpleIOのConsoleInに追加してみました.(添付ファイル参照)
これでも目的は達成されますが,ポーリングは効率が悪いため,
できればタイムアウト付きのイベント待ちを実装したいと思っています.

ユーザ空間でタイムアウト付きでイベントを待つ方法をご存じの方,
または,もっと効率の良い方法をご存じの方は
御教示頂けると助かります.

よろしくお願いします.

清水
--------------------
Masayuki Shimizu

Postdoctoral Fellow
Task Intelligence Research Group
Intelligent Systems Research Institute
National Institute of 
Advanced Industrial Science and Technology (AIST)
Central 2, 1-1-1, Umezono, Tsukuba, Ibaraki 305-8568, JAPAN
Tel: +81-29-861-5952
Fax: +81-29-861-5971
Email: masayuki.shimizu @ aist.go.jp
       chaser @ ieee.org
URL: http://unit.aist.go.jp/is/taskint/




-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: patch-SimpleIO-20070526
型:         application/octet-stream
サイズ:     4227 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20070531/836b3a0a/attachment-0001.obj>


openrtm-users メーリングリストの案内