【IT168技术】有过PC编程经验,尤其是熟悉进程以及线程编程的朋友都知道,进程的调度有kernel来执行,其中包括进程资源的分配以及进程间的通信,这种和内核经常交互的动作会浪费非常大的额外开销。进程会创建至少一个线程,而且一个进程只有一个主线程,进程间的各个线程共享同一个进程下的资源,这样就是以一个进程为资源的分配单位。其他线程共享进程的资源,进行多线程的编程,这样减少了进程间通信的额外开销,但是线程间的上下文切换同样也会出现额外开销,只不过这些开销在PC机上显得微不足道。但是移动开发作为嵌入式开发的一份子,由于使用的是微内核,资源的处理不及PC机强大,而且本身的受到内存以及硬件资源的影响,移动设备不鼓励使用多线程开发,就Symbian而言他是用一个线程来模拟多线程执行多任务,从而节省了时间和空间。这是使用活动对象最大的好处。下面是有关活动对象的几个方面介绍:
一、异步方法和异步服务
提到Symbian独特的活动对象,首先是要从异步方法和异步服务说起。Symbian OS应用程序使用事件驱动的方式访问系统提供的异步服务,而活动对象是实现异步事件处理的非常好的选择。所谓异步方法就是不需同步等待返回的结果,而继续执行应用程序的方法。异步方法本身不提供服务,只是发出请求,然后接着返回,等待服务提供者发出的服务完成的异步事件,直到接收到这个异步事件之后他才能知道服务到底有没有成功的完成。提供服务的是其他的应用程序,也就是所谓的服务提供者,他在完成服务后,会给服务提出者发送一个异步事件表明服务的完成情况。
打一个比方,一个客人去餐厅就餐,客人对服务员说他要点XXX菜,服务员就将客人的菜单交给了厨师,厨师来做菜。在这个过程中,客人发出了点菜的请求,而此时,客人没有必要完全不做任何的事情专心等待菜上来,他还可以看电视或者和朋友聊天等等。客人的请求就是异步请求,也就是前面讲的不必等到结果的返回再做其他的事情。厨师做菜就是异步的服务,菜做好了做个标记,然后给客人上菜,当然厨师也可以告诉客人这道菜没有做好,请客人再点其他的。
异步方法和同步方法相比,他的特点就是有一个 TRequestStatus & 参数,这个参数是一个状态的标记,表明服务的完成状态,它的值由异步服务者设置,当接到服务请求时会把它的值设置成 KRequestPending,这个值表示未完成,如果当值设为 KerrNone 时表明请求已经成功完成,如果服务未完成就将值设为一个错误值。
在Symbian OS推荐的处理异步事件的方法有两种,第一种就是使用User::WaitForRequest()静态函数等待异步服务的完成:
1TRequestStatus status;
2AsyncFuntion(status);
3User::WaitForRequest(status);// 等待异步服务的完成
这个方法用的是操作系统的信号量机制,但是这个方法是把异步方法变成了同步操作,会阻塞应用程序。
第二种方法就是使用活动对象机制,以异步方式处理异步事件。这个方法的效率要比第一种高,关键是不会阻塞应用程序。