WEB开发网
开发学院手机开发Symbian 开发 Symbian 逐步深入 阅读

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;wri

{

//为一个描述符分配一个空间

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.与系统中的异步函数绑定-à把活动对象注册到活动调度器中-à活动调度器会等待异步函数返回的”完成”消息。收到完成消息后,调度器会遍历所注册的活动对象,去寻找那些

上一页  2 3 4 5 6 7 8 9  下一页

Tags:Symbian 逐步 深入

编辑录入:coldstar [复制链接] [打 印]
赞助商链接