手持式移动设备嵌入式wince开发(线程)课件

上传人:aa****6 文档编号:54535905 上传时间:2018-09-14 格式:PPT 页数:20 大小:586.50KB
返回 下载 相关 举报
手持式移动设备嵌入式wince开发(线程)课件_第1页
第1页 / 共20页
手持式移动设备嵌入式wince开发(线程)课件_第2页
第2页 / 共20页
手持式移动设备嵌入式wince开发(线程)课件_第3页
第3页 / 共20页
手持式移动设备嵌入式wince开发(线程)课件_第4页
第4页 / 共20页
手持式移动设备嵌入式wince开发(线程)课件_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《手持式移动设备嵌入式wince开发(线程)课件》由会员分享,可在线阅读,更多相关《手持式移动设备嵌入式wince开发(线程)课件(20页珍藏版)》请在金锄头文库上搜索。

1、手持式移动设备嵌入式WinCE开发,6,线程,第,章,本章目标,掌握线程的概念,熟练掌握线程的创建、挂起等其他API函数,掌握线程间的同步方式,线程概述,WINCE足一个多任务操作系统,它采用了一种新的任务调度策略,也就是将一个进程划分成多个线程,每个线程轮流占用CPU的运行时间和资源。在这种策略下,操作系统将不断地将线程挂起、唤醒、冉挂起、再唤醒,如此循环,直至最终完成某个任务。 由于CPU的处理速度非常快,而且每个时间片又很小,闻此给人的感觉是多个线程在同时运行。同样在编写基于WINCE平台的应用程序时,也会用到多线程解决问题。 例如在编写一个后台处理程序时,为了不影响界面的操作,可以把它

2、放到一个独立的线程中进行处理。,线程,线程基本上是一个可执行单元,也就是说,它包括一个堆栈和一个处理器环境。当线程被挂起时,寄存器将被推到线程的堆栈中,活动的堆栈将变为要运行的下一个线程,该线裎的CPU状态将从它的堆栈中被推出,这样新的线程就将开始执行指令。 Windows CE是有优先级的多任务操作系统,它允许多重功能、进程在相同时间的系统中运行,支持最大的32位同步进程。一个进程包括一个或多个线程,每个线程代表进程的一个独立部分,而一个线程将被指定为进程的基本线程。进程能创造一个未定数目的额外线程,而额外线程的实际数目则仅由可利用的系统资源限定。,线程,进程中的线程可以共享进程地址空间。进

3、程中的所有线程都能访问给线程分配的内存,不管是文件句柄、内存对象句柄还是同步对象句柄,线程都对其具有相同的访问权限。,线程的优先级,Windows CE以抢占方式来调度线程。线程以“时间片”为单位来运行,在H/PC和掌上PC中,“时间片”通常是25毫秒。过了那个时间后,如果线程没有放弃它的时间片,并且线程并不紧急,系统就会挂起该线程并调度另一个线程来运行。 Windows CE将根据优先级方法来决定要运行的线程,高优先级的线程将在低优先级的线程前面调度。,线程的优先级,在线程之间分配时间的规则上,Winclows CE与桌面PC系统也有很大区别。与PC不同的是,CE进程是没有“优先级”的。 在

4、桌面PC系统中,线程的优先级首先来自父进程的优先级,也就是说高优先级进程拥有的线程在运行时拥有的优先级高于低优先级进程的线程。进程中的线程可以通过设置它们相关线程的优先级来重新定义它们在进程中的优先级。 由于Windwos CE没有进程优先级,因此进程间都是平等的。而进程中的单个线程可以拥不同的优先级。,线程的优先级,在Windows CE中,一个线程可以有8种优先级: THREAD_PRIORITY_TIME_CRITICAL:高于正常优先级3级,具有这个优先级的线程将不会被抢占。 THREADL PRIORITY_HIGHEST:高于正常优先级2级。 THREAD_PRIORITY_ABO

5、VE_NORMAL:高于正常优先级I级。 THREAD_PRIORITY_NORMAL:正常优先级,所有线程在创建时都是这个优先级。 THREAD_PRIORITY_BELOW_NORMAL:低于正常优先级1级。 THREAD_PRIORITY_LOWEST:低于正常优先级2绒。 THREAD_PRIORITY_ABOVE_IDLE:低于正常优先级3级。 THREAD_PRJORITY_IDLE:低于正常优先级4级,所有高优先级的线程都将在低优先级的线程之前运行,同一优先级的线程会以循环优先级方式运行。低优先级的线程永远不会抢占拥有高优先级的线程。 如果线程优先级是THREAD_PRIORIT

6、Y_TIME_CRITICAL,它们将永远不会被抢占,即使是另一个具有THREAD_PIUORITY_TIME_CRITICAL优先级的线程。所以,如果不是非常小心地使用THREAD_PIUORITY_TIME_CRITICAL忧先级线程,将可能会饿死系统中的其他所有线程。 这个优先级是为编写驱动程序中的中断服务而保留的,这样每一个线程都能快速地完成任务并释放它的时间片。,线程的API函数,创建线程 在介绍创建线程的函数之前,先来看看线程函数,因为所有的线程都必须从一个指定的函数开始执行,该函数就是线程函数,其声明如下: DWORD WINAPI ThreadProc(LPVOID lpPar

7、ameter参数指针)该函数需要输入一个LPVOID类型的参数,该参数可以是一个DWORD型的整数,也可以是一个指向一个缓冲区的指针,函数将返回一个DWORD型的值。线程函数定义了线程执行的内容。,Windows CE提供了CreateThread函数来创建线程,其声明如下:HAlDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadattributes, /线程安全指针,不支持DWORD dwStackSize, /为自己所用堆栈分配的地址空间大小,不支持LPTHREAD_START_ ROUTINE lpStartAddress,/线程函数地址LPV

8、OID lpParameter,/传入线程函数的参数DWORD dwCreationFlags,/控制线程创建的附加标志LPDWORD lpThreadld /新线程的ID值);,CE不支持lpThreadAttributes和dwStackSize参数,将它们设置成NULL和0值即可。 参数IpStartAddress揩向线程函数的地址。 参数lpParameter被传递到线程函数中。参数dwCreationFlags可以被设置成0或CREATE_SUSPENDED,如果该参数值传递的是0,则线程立即执行;如果该参数值传递的是CREATE_SUSPENDED,则被创建的线程将处于挂起状态,而

9、且必须要调用ResumeThread函数将其唤醒执行。 参数IpThreadld指向接收新创建线程的ID值。 如果CreateThread函数执行成功,它将创建新线程并返回新线程的句柄。如果不需要使用此线程句柄,则应将其关闭。如果CreateThread函数执行失败,将返回NULL值,终止线程 WINCE还提供了ExitThread方法来终止线程,该方法的声明如下:VOID ExitThread(DWORD dwExitCode) ExitThread方法唯一的参数就是设置线程退出代码。通过GetExitCodeThread函数可以查询线程的退出代码,该函数的声明如下:BOOL GetExit

10、CodeThread (HANDLE hThread,LPDWORD lpExitCode );参毅hThread指定线程句柄,而不是线程ID。参数lpExitCode是输出参数,用于得到线程的退出代码。如果线程仍在运行,那么lpExitCode的值就是STILL_ACTIVE。,挂起和恢复线程 正在运行的线程可以被挂起、暂停执行。通过使用SuspendThread函数即可实现以上功能,该函数的声明如下: DWORD SuspendThreadHANDLE hThread ); 该函数惟一的参数hThread代表要挂起线程的句柄。如果函数运行成功,返回值代表线程的挂起计数,行则返回OxFFFF

11、FFFF。WINCE为每一个线程都维护一个挂起汁数,挂起计数大于0的任何线程都足被挂起的。由于SuspendThread函数的调用将增加挂起计数,因此在实际调度线程运行之前,对SuspendThread函数的多次调用必须与刘ResumeThread函数的多次调用相匹配。,ResumeThread函数的定义如下:DWORD ResumeThread (HANDLE hThread )参数hThread同样代表要恢复线程的句柄。如果函数运行成功,将返回线程上次的持起计数,否贝0返回0xFFFFFFFF。,设置和查询线程优先级在前面的内容曾经提剑过CE中的线程具有8个优先级别,线程创建时的默队优先级

12、是THREAD_PRIORITY_NORMAL。CE提供SetThreadPriority函数用以改变线程的优先级,其声明如下:BOOL SerThreadPriority(HANDLE hThread,int nPrioriry );参数hThread代表要设置优先级的线程句柄。参数nPriority代表具体优先级值,它的值包括前面介绍过的常量,如果需要查询线程的优先级,可以通过GetThreadPriority函数实现,其声明如下:int GetThreadPriority(HANDLE hThread);该函数的惟一参数就是要奁询优先级线程的句柄。如果函数执行成功,则返回线程的优先级常量

13、,否则返叫THREAD_PRIORITY_ERROR_RETURN。,线程同步,线程同步 在使用线程时,会经常遇到两个概念,即线程冲突和线程死锁。下面将对这两个概念进行简要的比喻说明。 线程冲突:例如线程A读写数据G,线程B也止在读取数据G,那么很显然,该操作将会导致数据冲突,引起数据混孔。这里就需要我们使用同步技术,以保证线程A和线程B依次读写数据G,避免数据冲突。 线程死锁:例如人工人为了加工m零件在等待B提供的P零件,而B正好在等待应由A加工提供的Q零件以装配P零件。由于他们之间再没有其他任何人帮助通信或其他通信手段,他们都足坐在办公室里等着对方因为零件加工好而欲提供的电话也就永远都不会等到电话而变成一个死局。这种就是死锁,一般都是由于双方互相等待而产生的,属于逻辑错误,并不像上面的线程冲突那样可以通过线程同步来解决而属于设计程序时犯下的逻辑错误。,线程同步方式,线程同步的方式: 利用事件的同步 利用互斥同步 利用临界区同步 利用信号量同步,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号