Message子系统是Nebula3实现多线程架构的核心。
Port:1.消息接收端口。消息被立即处理并且程序将被阻塞直到消息处理完成。消息是通过增加到Port中的Handler来处理的,Port可以增加一个或多个Handler。当接收到一个消息,增加到Port中的每个Handler将被调用来处理消息,直到有一个Handler处理完消息后返回true,这意味着消息处理完成了。
2.Port::RegisterMessage(const Id& msgId)方法用来注册该Port能处理的消息类型。
AsyncPort:在一个分开的线程中调用handlers来处理消息,因此不会阻塞主线程。AsyncPort的子类覆写AsyncPort::OnCreateHandlers()方法,在这个方法中创建Handler并把它添加到AsyncPort中。
Handler:实际处理消息的类。用户需要继承Handler类并覆写Handler::HandleMessage()方法。
Id:消息类型标识符。在消息中使用DeclareMsgId和ImplementMsgId宏来实现。
Message:包装数据并可以被发送到Port和AsyncPort。这实现了一个通用的通信机制,不仅可以用于相同线程,线程之间,甚至还可以用在不同机器之间的通讯。Message作为一个普通的C++对象,可以被持久化。用户继承Message类实现自己需要的不同消息。
Dispatcher:是一个特殊的消息接收端口。Dispatcher把消息分发到能处理该消息的端口上。具体实现可以参考类图和以下图示: