Thread Rating:
  • 521 Vote(s) - 2.8 Average
  • 1
  • 2
  • 3
  • 4
  • 5
afterマクロの使用方法について
08-02-2011, 08:32 AM,
#4
RE: afterマクロの使用方法について
画面描画のタイミングを制御、というと誤解を招きそう。
質問者さんがいってるのは {after 0s do} というイディオムの話しですよね。

(0sより大きい値を指定して将来のあるタイミングに処理を予約する使い方はおそらくそれほど疑問はないと思うので)

よく乱用されることもあるこのイディオムの使い方を真面目に理解するにはまずイベントループとイベントキューについて分かる必要があります。
イベントループについてはWikipedia参照

Curlのことばで簡単に説明するとイベントループは以下のような概念として理解できます。
・Curlのシングルスレッドなアプレット毎にイベントループが裏で動いている
・ループの度にイベントキューから次に処理すべきEvent(とEventTarget)が取得される
・取得したイベントを処理する(EventTarget.handle-event)
・その後UIを再描画する
・次のループへ

イベントキューには、ユーザがUIを操作したり、プログラムから明示的に enqueue-event された場合などにエントリが追加されます。

こういった概念を前提にすると {after 0s do} というイディオムは、Event や EventTarget をとくに指定せずに処理だけをイベントキューの末尾に追加(enqueue)することといえます。
ちなみに似たような理解を必要とするものに dispatch-event がありますが、これは handle-event
の途中で呼ばれた場合に、そのループを中断して、イベントキューが空になるまでそれ以降のループを回しきる(待機中のイベントをすべて処理してUIの描画も行う)ということになります。中断したループは、イベントキューを空にしたあとに再開されます。
ついでに、View.update は handle-event の途中で呼ばれ、その時点で UI
の再描画のみを実行するものです。(呼ばなければ handle-event が完了するまで再描画されない)
dispatch-event でも再描画が行われる結果になりますが、説明したように後続のイベントまで(順番を無視して)処理してしまう点で View.update より副作用が大きいです。再描画のみであれば View.update を使うよう推奨されているのはこのためです。

※これはあくまで説明のために単純化しているので実際のCurlの仕組みは当然もっと複雑で詳細は異なります
Reply


Messages In This Thread
RE: afterマクロの使用方法について - by fukuta - 08-02-2011, 08:32 AM
Forum Jump:


Users browsing this thread:
1 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('166')