多线程编程技术详解-第一讲
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
象)不会被销毁。有鉴于些,更好的做法是直接从线程函数返回,不要自己调用ExitThread函数
第三种:TerminateThread函数
不同于ExitThread总是”杀死“主调线程,TerminateThread能”杀死“任何线程。TerminateThread函数是异步的,所 以函数返回时,并不保证线程已经终止了。
第பைடு நூலகம்节:编写ThreadDemo程序
1、向导生成ThreadDemo控制台程序 2、最终的程序效果 3、修改背景颜色 4、禁用最大化窗口 5、创建三个线程 6、实现CreateEditControlForMainWnd函数和CreateStaticForMainWnd函数 7、在WM_CREATE消息里添加相关代码 8、添加菜单 9、处理菜单消息 10、编写线程函数 11、处理WM_PAINT消息和WM_DESTROY消息
线程通过调用ExitThread函数“杀死”自己(要避免使用这种方法) 同一个进程或另一个进程中的线程调用TerminateThread函数(要避免使用这种方法)
第四节:线程的终止
第一种:线程函数返回
设计线程函数时,应该让线程自己返回,这样可以确保以下正确的应用程序清理工作都得以执行。
1.
2. 3. 4.
务,可由不同处理器分别来完成,提高了进程运行速度。
线程的组成部分
线程由两部分组成:
a) 线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
b) 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量
第二节:线程
何时创建线程 线程示例
比如:
1)电子表格软件可以在后台执行重新计算。 2)Web浏览器可以在后台与其服务器进行通信。在当前的结果显示出来之前,用户可以调整浏览器窗口的大小,或者转到其他网站)。 3)可以使用操作系统附带的磁盘碎片整理程序,它是在系统空闲的时候,在后台运行这个实用程序并进行磁盘碎片整理
线程函数中创建的所有C++对象都通过其析构函数被正确销毁。
操作系统正确释放线程栈使用的内存。 操作系统把线程的退出代码(在线程的内核对象中维护)设为线程函数的返回值 系统递减少线程的内核对象的使用计数。
第四节:线程的终止
第二种:ExitThread函数
该函数将终止线程的运行,并导致操作系统清理该线程使用的所有操作系统资源。但是,你的C/C++资源(如C++类对
第五节:线程的挂起和恢复
ResumeThread函数
DWORD ResumeThread( HANDLE hThread ); hThread 指定的要重新运行的线程的句柄
如果ResumeThread函数成功,它将返回线程的前一个挂起计数,否则,它将返回0xFFFFFFFF. 一个线程可以被多次挂起。如果一个线程被挂起三次,那么必需调用ResumeThread三次,才能使起线程运行。
第七节:编写ThreadDemo程序
禁用最大化按钮
在InitInstance函数里修改CreateWindow函数 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW &~WS_MAXIMIZEBOX, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 另一种方式: LONG lStyle = GetWindowLong(hWnd,GWL_STYLE); lStyle &= ~WS_MAXIMIZEBOX; SetWindowLong(hWnd,GWL_STYLE,lStyle);
lpThreadId lpThreadId:保存新线程的id。
第三节:线程的创建
注意事项
如果你不需要线程ID,lpThreadId参数可以被设为NULL,但这只在WindowsNT中才行得通,Windows95中就不行
。如果你要写一个程序可以在Windows 95中运行,不要把lpThreadId参数设为NULL。
第七节:编写ThreadDemo程序
修改背景颜色
在MyRegisterClass函数里,修改代码如下: wcex.hbrBackground = (HBRUSH)(CTLCOLOR_BTN+1);
第七节:编写ThreadDemo程序
1、向导生成ThreadDemo控制台程序 2、最终的程序效果 3、修改背景颜色 4、禁用最大化窗口 5、创建三个线程 6、实现CreateEditControlForMainWnd函数和CreateStaticForMainWnd函数 7、在WM_CREATE消息里添加相关代码 8、添加菜单 9、处理菜单消息 10、编写线程函数 11、处理WM_PAINT消息和WM_DESTROY消息
第七节:编写ThreadDemo程序
1、向导生成ThreadDemo控制台程序 2、最终的程序效果 3、修改背景颜色 4、禁用最大化窗口 5、创建三个线程 6、实现CreateEditControlForMainWnd函数和CreateStaticForMainWnd函数 7、在WM_CREATE消息里添加相关代码 8、添加菜单 9、处理菜单消息 10、编写线程函数 11、处理WM_PAINT消息和WM_DESTROY消息
调用CreateThread时,系统会创建一个线程内核对象,这个线程内核对象不是线程本身,而是一个较小的数据结构,操 作系统用这个结构来管理线程,可以把线程内核对象想象为一个由线程统计信息构成的小型数据结构。
第四节:线程的终止
线程的终止
线程可以通过以下3种方法来终止运行
1.
2. 3.
线程函数返回(这是强烈推荐的)。
第一节:进程
进程中的线程
1. 2. 单个进程可能包含若干个线程,这些线程都“同时” 执行进程地址空间中的代码。 每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建一个进程时,操作系统会自动创建这个进程 的第一个线程,称为主线程。此后,该线程可以创建其他的线程
第二节:线程
线程的概念
线程是指进程中执行运行的最小单位,即处理机调度的基本单位。和进程相比,进程是一项任务,线程是独立子任
第七节:编写ThreadDemo程序
创建三个线程
在WM_CREATE消息里添加三个线程 ThrHandle1 = CreateThread(NULL,0,ThreadProc1,NULL,CREATE_SUSPENDED,NULL); ThrHandle2 = CreateThread(NULL,0,ThreadProc2,NULL,CREATE_SUSPENDED,NULL); ThrHandle3 = CreateThread(NULL,0,ThreadProc3,NULL,CREATE_SUSPENDED,NULL); 定义三个全局的线程句柄,并初始化为NULL HANDLE ThrHandle1 = NULL; HANDLE ThrHandle2 = NULL; HANDLE ThrHandle3 = NULL; //线程的线程句柄 //线程的线程句柄 //线程的线程句柄
何情况下,Windows根据需要动态延长堆栈的大小
第三节:线程的创建
CreateThread
lpStartAddress, 指向线程函数的指针,函数名称没有限制,但是必须以下列形式声明: DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功 lpParameter, 向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL dwCreationFlags, 线程标志,可取值如下 (1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程, (2)0:表示创建后立即激活。
《多线程编程技术详解》
第一讲:线程基础
主讲人:步磊峰 UIPower 3D界面引擎负责人
第一节:进程
进程的概念
进程是指在系统中正在运行的一个应用程序,在传统的操作系统中,是资源的分配单位又是高度运行的单位。在现 代操作系统中,进程是资源的分配单位,一个进程通常定义为程序的一个实例。在32位Windows中,进程占据4GB(2的 32次方)的虚拟地址空间。
第七节:编写ThreadDemo程序
最终的程序效果
第七节:编写ThreadDemo程序
1、向导生成ThreadDemo控制台程序 2、最终的程序效果 3、修改背景颜色 4、禁用最大化窗口 5、创建三个线程 6、实现CreateEditControlForMainWnd函数和CreateStaticForMainWnd函数 7、在WM_CREATE消息里添加相关代码 8、添加菜单 9、处理菜单消息 10、编写线程函数 11、处理WM_PAINT消息和WM_DESTROY消息
第七节:编写ThreadDemo程序
向导生成ThreadDemo控制台程序
打开vs2008编辑器 选择“文件”---“新建”----“项目”---弹出“新建项目对话框” 在“项目类型”下选择“Win32” 在右边“模板下”选择“Win32项目” 在下面输入项目的名称:ThreadDemo 选择项目存放的位置 然后点击“确定“ 然后直接点击”完成“,如图
第一节:进程
进程的组成部分
进程由两个部分组成: a) b) 操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方 地址空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配 空间
第一节:进程
进程是不活泼的
进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线 程,此线程负责执行包含在进程的地址空间中的代码。
第五节:线程的挂起和恢复
SuspendThread函数
DWORD SuspendThread( HANDLE hThread ); hThread 指定的要挂起的线程的句柄
如果SuspendThread函数成功,它将返回线程的前一个挂起计数,否则,它将返回0xFFFFFFFF. 在实际开发中,应用程序在调用SuspendThread时必需小心,因为试图挂起一个线程时,我们不知道线程在做什么,比 如说如果线程正在分配堆中的内存,线程将锁定堆,当其他线程要访问堆的时候,它们的执行将被中止,直到第一个线 程恢复。
LPTHREAD_START_ROUTINE LPVOID lpParameter, DWORD dwCreationFlags, lpStartAddress,
LPDWORD lpThreadId
); lpThreadAttributes 指向SECURITY_ATTRIBUTES型态的结构的指针,这个参数通常设置为NULL dwStackSize 设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任
务,可由不同处理器分别来完成,提高了进程运行速度。
线程的组成部分
线程由两部分组成:
a) 线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
b) 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量
第二节:线程
线程的概念
线程是指进程中执行运行的最小单位,即处理机调度的基本单位。和进程相比,进程是一项任务,线程是独立子任
第二节:线程
何时不应该创建线程 线程示例
比如: 1)开发一个字处理程序,并且希望允许打印函数在它自己的线程中运行
第三节:线程的创建
CreateThread
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
第六节:线程睡眠
Sleep函数
使得线程在一段时间内自己不需要调度 void Sleep( DWORD dwMilliseconds );
dwMilliseconds
毫秒时间
第七节:编写ThreadDemo程序
1、向导生成ThreadDemo控制台程序 2、最终的程序效果 3、修改背景颜色 4、禁用最大化窗口 5、创建三个线程 6、实现CreateEditControlForMainWnd函数和CreateStaticForMainWnd函数 7、在WM_CREATE消息里添加相关代码 8、添加菜单 9、处理菜单消息 10、编写线程函数 11、处理WM_PAINT消息和WM_DESTROY消息