メッセージループ解剖

https://docs.google.com/document/d/1_pJUHO3f3VyRSQjEhKVvUU7NzCyuTCQshZvbWeQiCXU/view#heading=h.mf0ccgw3ul6k

外観

MessageLoopはChromiumの根本部品の1つです。その役割はイベントやタスクを処理することです。2つの重要なメソッドがPostTaskRunで、これによってポストされたタスクを関連付けられたスレッドで実行します。通常(テストでない場合)、staticメソッドのMessageLoop::current()によりカレントスレッドのMessageLoopが取得できます。しかし多くのプロダクションコードは直接MessageLoopを扱ったりしません。

PostTaskメソッドの種類

PostTaskMessageLoopに関連付けられたスレッドでタスクを実行するようスケジュールします。MessageLoopのメソッドを使って直接タスクをポストすることは推奨されていませしそのインタフェースは廃止されつつあります。そのかわりにより一般的なTaskRunnerを使うべきです。カレントスレッドのTaskRunnerThreadTaskRunnerHandle::Get()により取得できます。

Runメソッド

Runメソッドは、MessageLoopの内部メッセージポンプのイベント処理を開始し、ポストされたタスクを実行します。Chromiumのスレッドクラス(base::Thread)はこのメソッドを呼び出すので、プロダクションコードは明示的に呼ぶ必要はありません。テストコードでは、RunLoopインタフェース経由でメッセージループを実行することが推奨されます。

メッセージループとともに働くクラス

MessageLoopクラスはいくつかのクラスと綿密に連携して動作します。すなわちMessagePump, IncomingTaskQueueそしてMessageLoopProxyImplです。これらのクラスのインスタンスはMessageLoopがインスタンス化されたときに作成され、MessageLoopにより所有(または参照)されます。

MessagePump

内部的にはMessageLoopMessagePumpはペアになっています。MessagePumpはプラットフォーム特有のメッセージポンプで、ネイティブイベント(Windowsのメッセージや IOイベント)を処理します。MessagePumpDelegateインタフェースを提供し、DoWorkメソッドのセットを持ち、これらはプラットフォームのネイティブメッセージループから呼び出されます。MessageLoopはこのDelegateインタフェースを実装し、DoWorkメソッドでポストされたタスクを実行します。MessagePumpの1つしかない最も重要なメソッドがRunです。ネイティブイベントを処理し、MessageLoop::DelegateDoWorkメソッドを呼び出します。メッセージポンプも複雑なので別のドキュメントが必要です。

IncomingTaskQueue

IncomingTaskQueueはスレッドセーフなタスクキューで、MessageLoopのためのタスクを蓄積します。IncomingTaskQueueは2つの重要なメソッドを持っています。AddToIncomingQueueReloadWorkQueueです。AddToIncomingQueueはスレッドセーフなタスクキューにタスクを登録します。ReloadWorkQueueは内部のタスクキューと与えられたタスクキューをスワップします。普通は、AddToIncomingQueueによりMessageLoopにポストされたタスクはIncomingTaskQueueに登録されます(MessageLoopProxyImpl経由で)。IncomingTaskQueueに登録されたタスクはその後ReloadWorkQueueにより内部キューにロードされます。

MessageLoopProxyImpl

MessageLoopProxyImplMessageLoopProxy(これはSingleThreadTaskRunnerを拡張する)を拡張し、IncomingTaskQueueに対するMessageLoopProxyTaskRunnerインタフェースを提供します。MessageLoopProxyImplPostTaskメソッドのセットを提供し、タスクをIncomingTaskQueueい転送します。

MessageLoop::message_loop_proxy()MessageLoop::task_runner()はこのクラスのインスタンを返します。言い換えるとこのクラスは対応するMessageLoopTaskRunnerを提供します。

Page last modified on July 01, 2018, at 04:45 PM
Powered by PmWiki