外観
MessageLoopはChromiumの根本部品の1つです。その役割はイベントやタスクを処理することです。2つの重要なメソッドがPostTaskとRunで、これによってポストされたタスクを関連付けられたスレッドで実行します。通常(テストでない場合)、staticメソッドのMessageLoop::current()によりカレントスレッドのMessageLoopが取得できます。しかし多くのプロダクションコードは直接MessageLoopを扱ったりしません。
PostTaskメソッドの種類
PostTaskはMessageLoopに関連付けられたスレッドでタスクを実行するようスケジュールします。MessageLoopのメソッドを使って直接タスクをポストすることは推奨されていませしそのインタフェースは廃止されつつあります。そのかわりにより一般的なTaskRunnerを使うべきです。カレントスレッドのTaskRunnerはThreadTaskRunnerHandle::Get()により取得できます。
Runメソッド
Runメソッドは、MessageLoopの内部メッセージポンプのイベント処理を開始し、ポストされたタスクを実行します。Chromiumのスレッドクラス(base::Thread)はこのメソッドを呼び出すので、プロダクションコードは明示的に呼ぶ必要はありません。テストコードでは、RunLoopインタフェース経由でメッセージループを実行することが推奨されます。
メッセージループとともに働くクラス
MessageLoopクラスはいくつかのクラスと綿密に連携して動作します。すなわちMessagePump, IncomingTaskQueueそしてMessageLoopProxyImplです。これらのクラスのインスタンスはMessageLoopがインスタンス化されたときに作成され、MessageLoopにより所有(または参照)されます。
MessagePump
内部的にはMessageLoopとMessagePumpはペアになっています。MessagePumpはプラットフォーム特有のメッセージポンプで、ネイティブイベント(Windowsのメッセージや IOイベント)を処理します。MessagePumpはDelegateインタフェースを提供し、DoWorkメソッドのセットを持ち、これらはプラットフォームのネイティブメッセージループから呼び出されます。MessageLoopはこのDelegateインタフェースを実装し、DoWorkメソッドでポストされたタスクを実行します。MessagePumpの1つしかない最も重要なメソッドがRunです。ネイティブイベントを処理し、MessageLoop::DelegateのDoWorkメソッドを呼び出します。メッセージポンプも複雑なので別のドキュメントが必要です。
IncomingTaskQueue
IncomingTaskQueueはスレッドセーフなタスクキューで、MessageLoopのためのタスクを蓄積します。IncomingTaskQueueは2つの重要なメソッドを持っています。AddToIncomingQueueとReloadWorkQueueです。AddToIncomingQueueはスレッドセーフなタスクキューにタスクを登録します。ReloadWorkQueueは内部のタスクキューと与えられたタスクキューをスワップします。普通は、AddToIncomingQueueによりMessageLoopにポストされたタスクはIncomingTaskQueueに登録されます(MessageLoopProxyImpl経由で)。IncomingTaskQueueに登録されたタスクはその後ReloadWorkQueueにより内部キューにロードされます。
MessageLoopProxyImpl
MessageLoopProxyImplはMessageLoopProxy(これはSingleThreadTaskRunnerを拡張する)を拡張し、IncomingTaskQueueに対するMessageLoopProxyとTaskRunnerインタフェースを提供します。MessageLoopProxyImplはPostTaskメソッドのセットを提供し、タスクをIncomingTaskQueueい転送します。
MessageLoop::message_loop_proxy()とMessageLoop::task_runner()はこのクラスのインスタンを返します。言い換えるとこのクラスは対応するMessageLoopのTaskRunnerを提供します。