实现
- windows采用命名管道
- linux/x os 采用socketpair()
- browser process中 I/O thread处理消息避免UI thread阻塞;view通过ChannelProxy进行消息的收发,ChannelProxy::MessageFilter 插入RenderProcessHost用于过滤资源请求类消息在I/O thread中处理
render process中 main render thread用于处理browser和webkit的通信,并提供同步通信机制
消息类型
control message - 直接由View/ViewHost处理
- routed message - 由View派发给注册routed的对象处理
- View message - 发送给RenderView的消息
- ViewHost message - 发送给RenderViewHost的消息
- PluginProcess - message browser process发送给plugin process的消息
PluginProcessHost - plugin process发送给browser process的消息
消息声明
文件 rendermessagesinternal.h
IPC_MESSAGE_ROUTED2(ViewHostMsg_MyMessage, GURL, int) IPC_MESSAGE_CONTROL0(ViewMsg_MyMessage)
- 参数太多则可以使用结构体包装
Send(new ViewMsg_StopFinding(routing-id));
处理消息
MyClass::OnMessageReceived(const IPC::Message& message) {
IPC_BEGIN_MESSAGE_MAP(MyClass, message)
// Will call OnMyMessage with the message. The parameters of the message will be unpacked for you.
IPC_MESSAGE_HANDLER(ViewHostMsg_MyMessage, OnMyMessage)
...
IPC_MESSAGE_UNHANDLED_ERROR() // This will throw an exception for unhandled messages.
IPC_END_MESSAGE_MAP()
}
// This function will be called with the parameters extracted from the ViewHostMsg_MyMessage message.
MyClass::OnMyMessage(const GURL& url, int something) {
...
}
同步消息
IPC::SyncMessage 阻塞进程直到返回
/* 声明 */
IPC_SYNC_MESSAGE_CONTROL2_1(SomeMessage, // Message name
GURL, //input_param1
int, //input_param2
std::string); //result
/* 处理 */
IPC_MESSAGE_HANDLER(MyMessage, OnMyMessage)
to the OnMessageReceived function, and write:
void RenderProcessHost::OnMyMessage(GURL input_param, std::string* result) {
*result = input_param.spec() + " is not available";
}
标签:
chromium
日期: 2014-08-01 17:30:06, 11 years and 111 days ago
