伯乐共勉

讨论。NET专区
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2007-02-09 17:46  伯乐共勉  阅读(267)  评论(0编辑  收藏  举报
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/Symbi ... al/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函数会被自动调用。