作为多线程,首先要考虑到的是 RThread 类。RThread 类从 RHandleBase 类继承,所以它首先是一个对象的句柄(a handle of an object),包括了 Close(), Duplicate(), FullName(), Handle(), HandleInfo(), Name(), RHandleBase(), SetHandle(), SetHandleNC() 方法。这个类是一个抽象类,没有自己的实例,通常都是作为其他类的基类使用,例如 RSemaphore, RThread, RProcess, RCriticalSection 等。RTimer 类是从RHandleBase 继承的一个类,可以通过这个类,来说明一些 RHandleBase 的一些问题 。 以下是代码。
#include <e32base.h> #include <e32cons.h> // 定义本地数据 //全局函数,被 E32 调用的主函数, LOCAL_C void NewCsoLC()
// 设置与当前句柄相关联对象的 handle-number
// 获得句名称 // HandleInfo() 方法需要传入一个 THandleInfo 型的指针 Hif->iNumOpenInProcess=8; console->Printf(_L("iNumOpenInProcess:%d "),Hif->iNumOpenInProcess); |
[2] RThread 类
在这个类中,需要了解他主要的几个方法。
1.Create()方法:这个方法有四个版本的重载函数,但是基本的参数也就这些:
参 数 | 描 述 |
const TDesC& aName | 线程的名称 |
TThreadFunction aFunction | 一个指向函数的指针,当线程被恢复时调用该函数,也就是线程最初预定运行的函数。 |
TInt aStackSize | 新线程的 Stack 大小,它不可以为负值,否则函数将发生 USER 109 panic |
TAny* aPtr | 一个指向数据的指针,这些数据是线程函数运行所需要的,如果线程函数不需要参数,则可以把该指针置为NULL |
TInt aHeapMinSize | 新线程 heap 的最小值, 这个值必须不小于在 e32std.h 中定义的 KMinHeapSize,否则函数将发生 USER 110 panic |
TInt aHeapMaxSize | 新线程的 heap 的最大值, 它必须不小于 aHeapMinSize,否则函数将个发生 USER 111 panic |
TOwnerType aType | 它是一个枚举型变量,指明要创建的线程是属于进程还是线程,如果这个值没有被指定,那么将默认 EOwnerProcess,也就是说,新的线程是属于进程的。 |
RProcess* aProcess | 指明当前线程所属的进程 |
RLibrary* aLibrary | 指明线程函数所在的 DLL |
2.Resume()
方法:这个方法使创建好的线程处于执行状态。刚刚创建好的线程是处在暂停状态的,Resume()
方法使线程从暂停态转到执行态。
3.Kill() 方法:以指定的原因代码退出指定线程;它与 User::Exit() 的功能类似。
[3] RSemaphore
类
Semaphore 应该是信号量的意思,这个应该是《操作系统》里的知识吧。信号量(semaphore)是一个内核对象,RSemaphore类提供了对 semaphore的句柄引用。既然它是一个资源类,那么他的使用和操作其他资源类是类似的,在使用前要创建、使用完成后要关闭。
1.Wait() 方法:使信号量减 1。
2.Signal() 方法:使信号量增加 1,如果带参数,则使增加参数所指定的量。
3.Count() 方法:返回当前信号量的值;
以下是两个线程同时使用 两个 TInt 型 :num 和 Tnum 的程序,在这里下载 VC++6 工程文件。
#include <e32base.h> #include <e32cons.h> #include <E32math.h> // 定义本地数据 LOCAL_C TReal GetRandom(); const TUint KDefaultHeapSize=0x10000; LOCAL_D RThread T_1,T_2; //全局函数,被 E32 调用的主函数, LOCAL_C void NewCsoLC() console->Printf(_L("Press [C] or [D] ")); //press 2 User::At 测试 TDateTime dtm; console->Printf(_L("%f "),a); /* CleanupStack::PopAndDestroy(); TInt ThreadFunction(TAny* aAny) TInt *increment = reinterpret_cast<TInt*>(aAny); }
LOCAL_C void ThreadL() TInt inc1 = 10, inc2 = -10; //创建一个信号量并初始化
console->Printf(_L("[%d:%d] "),Tnum,num); T_1.Kill(0); T_1.Close(); // 当两个进程都结束了,那么 } // 获得一个O-1的随机数 |