关于 RMsgQueue 类的使用
2010-04-18 06:50:00 来源:WEB开发网关于RMsgQueue类的使用
RMsgQueue类是Symbian OS EKA2才提供的一个类,最近因为项目中要使用,为此对使用进行如下小结。
因为RMsgQueue类只是一个封装好的内核资源类,类似于RSocket和RTimer类,要想使用它进行异步操作就必须对其用AO类来封装,从而来实现监听消息,在有消息过来时得到通知并根据消息内容进行相对应的处理。
那这个消息内容又该如何定义呢?我们可以参看下RMsgQueue类定义
template
class RMsgQueue : public RMsgQueueBase
{
public:
TInt CreateLocal(TInt aSize, TOwnerType aType=EOwnerProcess);
TInt CreateGlobal(const TDesC& aName, TInt aSize, TOwnerType aType=EOwnerProcess);
TInt Send(const T& aMsg);
void SendBlocking(const T& aMsg);
TInt Receive(T& aMsg);
void ReceiveBlocking(T& aMsg);
};
显然该类RMsgQueue也是Symbian的?模板类,具体消息内容可以根据需求自定义类型,即如果传递的消息足够简单则可以采用Tint类型来定义,考虑到我们的实际应用对消息内容进行如下定义
typedef enum _NetWork_Msg_Type
{
NetworkSocketCreate,
NetworkSocketConnect,
NetworkSocketSend,
NetworkSocketRecv,
NetworkSocketClose,
}NetWorkMsgType;
typedef struct _NetWork_Msg
{
NetWorkMsgType m_msgType;
TInt32 m_msgFd;
}NetworkMsg;
其中的NetworkMsg就是我们在这里使用的消息内容,其中的成员m_msgType 是NetWorkMsgType定义的枚举值,表示消息类型,另一个成员m_msgFd是我们跨线程传递一个Id值。
有了以上消息内容,我们就可以简单的来定义消息队列了
RMsgQueue
如上已经实例化了一个RMsgQueue对象,但是RMsgQueue对象必须要像RTimer一样需要调用CreateLocal或者CreateGlobal才能创建起来,那我们在哪里创建它呢?这两个创建又有什么区别呢?由于RMsgQueue可以是全局的也可以是局部的,假如使用局部的,那么类的封装性较好,而且可以很好的跨进程使用,但是缺点是需要传递对象,此时创建就可以使用CreateGlobal。考虑到我们只在一个进程的不同线程间使用,同一进程的线程间可以共享资源(内存),所以这里我们就采用简单的全局变量来实现它,为此创建就用了简单的CreateLocal函数,而且我们将其放在了AO的二阶段构造中,详见示例代码。
赞助商链接