Symbian 逐步深入
2010-03-26 04:24:00 来源:WEB开发网{
//为一个描述符分配一个空间
TBuf buf;
buf.Create(64);
buf.CleanupClosePushL();
buf.Append(KSampleBuffer,1);
//
CStreamSample* sSample=newLC(1,buf);//这又是?
RMemWriteStream write;
write.PushL();
write.Open(a,aMaxLen);
write<<*sSample;
write.CommitL();
CleanupStack::PopAndDestory(&write);
buf=KSampelBuffer2;
CStreamSample* sSample2=newLC(2,buf);
RMemReadStream read;
read.PushL();
read.Open(a,aMaxLen);
read>>*sSample2;
read.CommitL();
CleanupStack::PopAndDestory(4); //….4??why is 4
}
Symbian的活动对象:
活动对象与多线程
win32的程序为了实现执行多任务,采用多线程的方式;虽然Symbian也支持多线程,但是提出活动对象是因为:资源有线。多个活动对象上下文之间的切换较之于多线程上下文的切换,效率更高。
我们看一下这个例子:
在win32中,socket编程阻塞在CScoket::Receive()函数上。请求方只有在收到返回的网络字节后才能进一步进行程序处理。
在Symbian平台中,则为RSocket::Receive(),该函数是异步函数,所以不会在这个阶段阻塞。函数的声明:
IMPORT_C void Recv(TDe8 &des,TUint aFlag,TRequestStatus &aStatus);
aStatus的初始值为ERequestPending,当事情处理完毕的时候,则变成 EActive。所以我们可以用如下的方法来辨别请求完成与否:
TRequestStatus iStatus(ERequestPending);//初始化
RSocket::Receive(aDes,aFlags,iStatus); //
for(;;)
{
if(iStatus!=ERequestPending)
break;
}
Symbian OS建议我们使用异步方法(上面的死循环代价太高了),事实上活动对象的意义就在于此,它构建了一个框架,在这个框架中已经有一个机制去辨别status是不是为ERequestPending了。
活动对象的处理流程:系统中有一个”活动调度器”,我们建立一个活动对象 a1,该对象进入如下流程:1.与系统中的异步函数绑定-à把活动对象注册到活动调度器中-à活动调度器会等待异步函数返回的”完成”消息。收到完成消息后,调度器会遍历所注册的活动对象,去寻找那些
更多精彩
赞助商链接