C++ Builder 6程序设计教程 教学课件 ppt 作者 陆卫忠 刘文亮 等第十一章c++Builder高级应用

上传人:w****i 文档编号:94380977 上传时间:2019-08-06 格式:PPT 页数:72 大小:445.50KB
返回 下载 相关 举报
C++ Builder 6程序设计教程 教学课件 ppt 作者 陆卫忠 刘文亮 等第十一章c++Builder高级应用_第1页
第1页 / 共72页
C++ Builder 6程序设计教程 教学课件 ppt 作者 陆卫忠 刘文亮 等第十一章c++Builder高级应用_第2页
第2页 / 共72页
C++ Builder 6程序设计教程 教学课件 ppt 作者 陆卫忠 刘文亮 等第十一章c++Builder高级应用_第3页
第3页 / 共72页
C++ Builder 6程序设计教程 教学课件 ppt 作者 陆卫忠 刘文亮 等第十一章c++Builder高级应用_第4页
第4页 / 共72页
C++ Builder 6程序设计教程 教学课件 ppt 作者 陆卫忠 刘文亮 等第十一章c++Builder高级应用_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《C++ Builder 6程序设计教程 教学课件 ppt 作者 陆卫忠 刘文亮 等第十一章c++Builder高级应用》由会员分享,可在线阅读,更多相关《C++ Builder 6程序设计教程 教学课件 ppt 作者 陆卫忠 刘文亮 等第十一章c++Builder高级应用(72页珍藏版)》请在金锄头文库上搜索。

1、C+Builder 6 程序设计教程,第十一章 C+Builder 高级应用,11.1 多线程应用程序,11.1.1 进程与线程 进程:可并发的程序在一数据集合上的运行过程,是操作系统进行资源分配和调度的一个独立单位。进程是由私有的虚拟地址空间、代码、数据和其他各种系统资源组成的。 线程:进程中的一个实体,是被系统独立调度和分派的基本单位,线程的分类: 用户界面线程:通常用来处理用户的输入并响应各种事件和消息 工作线程(又称为后台线程):来执行程序的后台处理任务,比如计算、调度和对设备的读写操作等 进程和线程示例,11.1.2 利用Win32 API编写多线程应用程序,利用Win32 API来

2、编写多线程应用程序的一般步骤如下: (1) 编写一个线程的执行函数 (2) 创建并执行线程 (3) 控制线程的运行(挂起或唤醒线程) (4) 结束线程,创建线程的执行函数 所有线程必须从一个指定的函数开始执行,该函数称为线程函数,它必须具有下列原型: DWORD WINAPI ThreadFunc( LPVOID lpThreadParm); 参数lpThreadParm可以是一个DWORD型的整数,也可以是一个指向一个缓冲区的指针,返回一个DWORD型的值,创建线程 一个进程的主线程是在进程创建时由操作系统自动生成,如果要让一个主线程创建它的辅助线程,可以调用CreateThread来完成。

3、原型如下: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, /线程的安全属性 DWORD dwStackSize, /初始化线程栈的大小 LPTHREAD_START_ROUTINE lpStartAddress, /指向线程函数地址的指针 LPVOID lpParameter, /新线程的参数 DWORD dwCreationFlags, /创建的标志 LPDWORD lpThreadId /返回线程的标识符指针 );,参数意义 lpThreadAttributes:是一个指向SECURITY_ATTRIBUTES

4、结构的指针。如果想让对象为缺省安全属性的话,可以传一个NULL;如果想让任一个子进程都可继承该线程对象句柄,必须指定一个SECURITY _ATTRIBUTES结构,其中bInheritHandle成员初始化为TRUE dwStackSize:是线程为自己所用堆栈分配的地址空间大小,0表示采用系统缺省值 lpStartAddress:是新线程开始执行时代码所在函数的地址,即为线程函数 lpParameter:是传给线程函数的参数 dwCreationFlags:是指定控制线程创建的附加标志,可以取两种值。如果该参数为0,线程就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统

5、创建线程后,并不马上执行,而是挂起该线程,直到调用ResumeThread函数 lpThreadId:是一个DWORD类型地址,返回该新线程的ID值 函数调用成功,返回值为新线程的句柄,否则为NULL,终止线程 (1)在线程内调用ExitThread函数,就可以终止自身。原型: VOID ExitThread( DWORD dwExitCode / 线程的退出代码 ); 该函数为调用它的线程设置了退出码dwExitCode后,就终止并清除该线程使用的系统资源 (2)在线程外通过调用TerminateThread函数强行终止一个线程。原型: BOOL TerminateThread( HANDL

6、E hThread, / 线程的句柄 DWORD dwExitCode / 线程的退出代码 ); 该函数用来结束由hThread参数指定的线程,并把dwExitCode设成该线程的退出码,设定线程的相对优先级 当一个线程被首次创建时,它的优先级等同于它所属进程的优先级。在单个进程内可以通过调用SetThreadPriority函数改变线程的相对优先级。一个线程的优先级是相对于其所属的进程优先级而言的。 BOOL SetThreadPriority( HANDLE hThread, /线程的句柄 int nPriority / 线程优先级 ); 其中参数hThread是指向待修改优先级的线程的句

7、柄,挂起及恢复线程 在调用CreateThread时,通过传递CREATE_SUSPENDED标志给函数可以创建挂起状态的线程。 (1)要执行一个挂起的线程,另一个线程必须调用ResumeThread并传递给它调用CreateThread时返回的线程句柄。 格式如下: DWORD ResumeThread(HANDLE hThread); (2)一个线程可以被挂起多次。如果一个线程被挂起两次,则该线程在它被分配CPU之前必须被恢复两次。除了在创建线程时使用CREATE_SUSPENDED标志,还可以用SuspendThread函数挂起线程。 格式如下: DWORD SuspendThread(

8、HANDLE hThread);,11.1.3 线程间的同步与通信,通信:全局变量、共享存储器、消息 同步 :保证各个线程可以在一起适当的协调工作称为线程之间的同步。操作系统内核提供事件(Event)、互斥量(Mutex)、信号灯(Semaphore)和临界区(CCriticalSection)来控制线程间的同步。,临界区,临界区是保证在某一个时间只有一个线程可以访问数据的方法。使用它的过程中,需要给各个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其它的线程需要等待,直到该线程释放临界区对象为止,临界区被释放后,另外的线程可以强占这个临界区,以便访

9、问共享的数据,共享存储器,Win32 API为用户提供了一种进行文件操作的高效途径,即内存映射文件。内存映射文件允许在Win32进程的虚拟地址空间中保留一段内存区域,把目标文件映射到这段虚拟内存之中。可以用存取内存数据的方式直接操作文件中的数据,就好像这些数据放在内存中一样。此外一个Win32进程可以利用内存映射文件在Win32进程共享的地址空间中保留一块区域,利用它与其他Win32进程进行通信,使用内存映射文件的方法 (1) 调用CreateFile或OpenFile函数,以适当的方式创建或打开一个文件对象 函数CreateFile功能较强,但OpenFile参数较少,易于使用 HANDLE

10、 CreateFile( LPCTSTR lpFileName, /文件名 DWORD dwDesiredAccess, /访问方式 DWORD dwShareMode, /共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes, /安全属性 DWORD dwCreationDisposition, /创建方式 DWORD dwFlagsAndAttributes, /属性 HANDLE hTemplateFile); /文件模板,HFILE WINAPI OpenFile ( LPCSTR lpFileName, /文件名 LPOFSTRUCT lpO

11、F, /打开方式 UINT uStyle ); 返回值为-1时表示打开文件失败。参数uStyle定义了打开文件标志,如OF_READ、OF_WRITE、OF_READWRITE等,指定访问方式;文件被其它进程共享的方式,如:OF_SHARE_EXCLUSIVE、OF_SHARE_DENY_WRITE等;及文件打开时采取的动作,如:OF_CREATE、OF_DELETE、OF_EXIST等。 关闭打开的文件,可以调用函数CloseHandle(),(2)把CreateFile函数返回的文件句柄作为参数,传给CreateFileMapping函数,由CreateFileMapping函数创建一个文

12、件映射对象 CreateFileMapping函数用法如下: HANDLE CreateFileMapping ( HANDLE hFile, LPSECURITY_ATTRIBUTES lpsa, DWORD dwPROTECT, DWORD dwMaxSizeHigh, DWORD dwMaxSizeLow, LPCSTR lpszMapName);,参数意义: hFile:是从OpenFile()调用返回的文件句柄;dwPROTECT:是页保护标识(PAGE_READONLY等),它必须和文件打开时定义的文件存取标志一致; dwMaxSizeHigh和dwMaxSizeLow:共同定义了

13、最大文件尺寸(64位); lpszMapName:定义了文件映射对象的名字。是用户给文件映射对象起的名字,必须确保其惟一性。要共享此文件的进程通过相同的文件映射名实现共享,可以有三种方法:CreateFileMapping,OpenFileMapping,DuplicateHandle,(3)调用MapViewOfFile函数,系统把文件的一部分映射到进程的地址空间中 LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffset

14、Low, DWORD dwNumberOfBytesToMap); hFileMappingObject:为CreateFileMapping返回的文件映射对象句柄 dwDesiredAccess:再次指定了对文件数据的访问方式,而且要与CreateFileMapping函数所设置的保护属性相匹配 dwFileOffsetHigh和dwFileOffsetLow :指定文件的偏移地址,(4)利用MapViewOfFile函数返回的指针(地址指针)来使用文件数据 (5)操作完毕后,调用UnmapViewOfFile()函数,系统撤销对文件映射对象的映射 BOOL UnmapViewOfFile(

15、LPCVOID lpBaseAddress); 参数lpBaseAddress设定为MapViewOfFile的返回值。在使用了函数MapViewOfFile之后,必须要有对应的UnmapViewOfFile调用,否则在进程终止之前,保留的区域将无法释放 (6)使用CloseHandle函数关闭文件映射对象 (7)使用CloseHandle函数关闭文件对象,利用内存映射文件实现Win32进程间的通信 如果在调用CreateFileMapping函数时,传递的文件句柄为0xFFFFFFFF,则创建一个基于页面交换文件的内存映射对象,系统从页面交换文件中提交物理存储。在这种情况下,如果两个进程使用

16、同一文件映射对象,在各自的进程中打开各自的视图,或者父进程把自己创建的文件映射对象继承给子进程使用,进程之间就可以实现通信 示例:,消息通信,Win32中的消息是应用程序中多线程间通信的最常用的方法。在C+Builder中实现消息通信的方法如下: (1) 在窗体类的.h文件中通过#define定义用户消息。如: #define WM_MYMESSAGE WM_USER+100 (2) 在窗体类的.h中文件定义消息的响应函数 (3) 在该窗体类的实现文件.cpp中实现该消息响应函数,11.1.4 TThread类,利用TThread类来编写多线程应用程序的一般步骤如下: (1) 从TThread类派生出一个新的线程类 (2) 创建线程对象 (3) 设置线程对象的属性 (4) 根据具体情况挂起或唤醒线程 (5) 结束线程,创建新线程类 通过菜单【File|New|Others】打开“New Items”对话框,选中New选项卡中的Thread Object项,单击“OK”按钮,在弹出的“Ne

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

当前位置:首页 > 高等教育 > 大学课件

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