Symbian OS支持多线程, 但是用得很少, 因为官方建议尽可能使用Active Object代替。 我们将在下一课讲解Active Ojbect 和推荐使用它的原因。
Symbian OS支持多线程, 但是用得很少, 因为官方建议尽可能使用Active Object代替。 我们将在下一课讲解Active Ojbect 和推荐使用它的原因。 考虑对于 普通的程序员来说多线程是一个要熟悉的多的概念, 我们在这一课将通过一个很简单的例子来介绍它在Symbian OS中的实现。 首先, RThread 类代表线程,我们可以通过这个类来创建,启动,停止,关闭线程,它还包括其他一些有用的API, 大家可以参看文档。 要创建线程RThread中一共有3 个Create函数, 基本大同小异,我们这里就用第一个: TInt Create(const TDesC& aName,TThreadFunction aFunction,TInt aStackSize,TInt aHeapMinSize,TInt aHeapMaxSize,TAny *aPtr,TOwnerType aType=EOwnerProcess); aName: 线程的名称 aFunction: 线程要执行的函数 aStackSize: 栈的大小, 一般都使用KDefaultStackSize(缺省值) aHeapMinSize: 堆的最小值 aHeapMaxSize: 堆的最大值 aPtr: aFunction的参数, 可以是任意指针 aType: 缺省值为EOwnerProcess 当一个线程被创建后, 它处在非活动状态, 要启动它需要调用 Resume()函数。 最后, 我们要知道线程是否已经执行完毕, 有很多方法,这里用了一个最简单的:semaphore. 下面将介绍一个多线程的例子,因为sdk中用到多线程的例子比较复杂, 我在文字版的helloworld上建立了一个很简单的例子。 不过你再按照本文修改 helloworld之前,建议把原本的例程做一个备份, 这样万一以后忘了怎么写helloworld也不至于去下载一个新的sdk:) 这个程序创建两个线程, 他们同时试图修改十个整数:num, 运行的时候我们会看到num的值总是徘徊于初始值:100左右。 修改过的helloworld.cpp 在:http://homepage.ntlworld.com/jiayao/Symbian_Junior_Tutorial/Lesson8/helloworld.cpp TInt ThreadFunction(TAny* aAny) 是线程要执行的函数, 它的名称可以是任意的, 但是参数必须是(TAny* aAny). 我们可以用这个指针来传递任何数据, 可 以是整数,Descriptor, 数组等等。 返回值必须是TInt. 我的实现很简单, 它对num 进行100次改动, 根据aAny的值来定改动的方向和幅度。 每次改动之间 等待0-1秒。 下边doExample是程序的入口, t1,t2为两个线程,注意每一个线程创建之后的CleanupClosePushL(...), 这个是CleanupStack::PushL的延伸。 假如创建t1后我 们直接创建t2, 然后在创建t2的过程中发生错误,通过User::LeaveIfError(err);离开, 那么t1所分配的内存就泄漏了。 为了避免这个情况, 我们要把t1的放 到清洁栈上。 然而记得我们第2课讲的,R-class本身不动态分配内存, 他只是系统资源的一个句柄。要回收资源就必须使用它的Close函数。 CleanupClosePushL() 就是为此情况设计的。 它把对象放在清洁栈上, 当离开发生的时候自动调用那个对象的Close函数。 然后我们创建一个Semaphore来判断线程是否结束, 当一个线程结束时, 它会调用semaphore的Signal函数使它的值加一。 调用Resume来启动线程。 当它的值在2你内的时候我们每1/10秒输出一次num的值。 最后从清洁栈上取下t1,t2, 他们的Close函数会被自动调用。 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-126296/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10294527/viewspace-126296/