Action Interval と Parallelism を実現するために, sclient1 は select()関数のタイムアウト機能を使用する.
プログラムの重要な部分は MyPlayer::run() にある.以下にソースコー ドの一部を示す:
//---------------------------------------- // enter main loop SocketReadSelector selector ; TimeVal nexttic ; // indicate the timestamp for next command send nexttic.update() ; // set nexttic to the current time. while(True) { //------------------------------------------------- // setup selector selector.clear() ; selector.set(socket) ; //------------------------------------------------- // wait socket input or timeout (100ms) ; Int r = selector.selectUntil(nexttic) ; if(r == 0) { // in the of timeout. (no sensor input) doAction() ; // enter action part nexttic += TimeVal(0,100,0) ; // increase nexttimetic 100ms } else { // got some input doSensing() ; // enter sensor part } }class SocketReadSelector は select() の機能を抽象化するクラス であり,"itk/Socket.h" で定義されている. ``Int r = selector.selectUntil(nexttic) ;'' の行では,プログラムは ソケットからの入力か nexttic で示されるタイムアウトを待つ. nexttic は次のticのタイムスタンプ(シミュレーションステップ)を保 持する. 関数は,タイムアウトが発生すれば0を返し,ソケットに受信データがあれば その数を返す. タイムアウトの場合,プログラムは doAction() を呼び出し,コマンドが 生成されてサーバへと送信される. それ以外の場合(受信データがある場合),doSensing() が呼び出され, センサ情報が処理される.