商务合作:179001057@qq.com

Symbian OS 开发初级手册 8 多线程

技术2022-05-11  0


某平台价值19860元的编程课程资料免费领取【点我领取】


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/<a class='Channel_KeyLink' href='http://www.sj263.com/Article/200502/414.shtml'>Symbian</a>_Junior_Tutorial/Lesson8/helloworld.cppSymbian_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来判断线程是否结束, 当一个线程结束时, 它会调用semaphoreSignal函数使它的值加一。

调用Resume来启动线程。

当它的值在2你内的时候我们每1/10秒输出一次num的值。

最后从清洁栈上取下t1,t2, 他们的Close函数会被自动调用。


最新回复(0)