《Windows编程教案.pdf》由会员分享,可在线阅读,更多相关《Windows编程教案.pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.Windows 编程教案第一课第一课最简单的最简单的 WindowsWindows 程序程序2 2 学时学时Windows 编程是一个很大的主题,涉及的方面也非常的多。Windows 始于 90 年代,至今 Windows 编程的开展已经非常成熟了,而单独直接使用单独直接使用 APIAPI 的开发也是越来越少了。因此,市面上很少有泛泛的简单入门级的 Windows 程序设计了。一个是系统级的 Windows 编程介绍,如 Windows 核心编程。一个是方向级的Windows 编程介绍如 Windows 图形编程,Windows 网络编程等等。我们这次课的主要参考用书是 Windows 核心
2、编程,同时也参考了一些其他容。 鉴于教材的价格较贵, 同时也需要考虑我们自身的学习容不一定很多以及学时的原因,就没有定教材。看我的教案吧。(1) Win32 APIAPI: Application Program Interface。应用程序接口。API 就是在进展 Windows 编程时使用的函数库。本课就是Windows 编程=API+C 语言或者 C+语言(2) 开发环境我校机器上安装了 VC+ 6.0。相信这是大家一直以来学习C,C+使用的开发环境。 但 VC60离我们实在太远了, 它是一款 90 年代的产品, 已经近 20 年的历史了。 我们机器里还有VS2005或 VS2008,那
3、里面的 C 环境要比 VC60 强太多了,强烈建议大家使用更高级的平台。本次授课的开发环境有两个。一个是轻量级的DEV C+,一个是重量级的 VS2010.简单程序我们都将用 DEV C+来实现。DEV C+是一个非常小的 C 环境,但性能要优于VC60,调试环境不如 VC60。这个环境在我们的共享资源里有,大家可以下载安装。安装过程非常简单,一直下一步即可。这是其主界面。(3) 最简单的 Windows 程序提到最简单的程序,几乎所有的人都会想起经典的HelloWorld。这不是 Windows 程序,如果在以前这叫DOS 程序,现在叫Windows 控制台应用程序。它不算 Windows
4、程序,但它很简单的就把 Helloword 显示到屏幕上了。而 Windows 程序要想把HelloWorld 显示在屏幕上就确实不容易了。3.1访问 Helloworld,因为把Helloworld 显示在屏幕上并不容易,我们可以一点一点来,先让 Helloworld 以文字形式出现在其他地方,这里我们通过访问helloworld.。把 helloworld展现在网页浏览器的地址栏上。真有这个吗.唉,貌似还真有。运行程序,翻开浏览器并访问。这是 Windows 程序。Windows 程序和我们以前的程序有什么不同呢.Windows 程序不能使用 scanf,printf,cin,cout。所
5、以输出 helloworld 变得没有以前容易了。windows 程序一定要*include windows 程序的主函数不是 main,是 WinMain。注意区分大小写。主函数的参数不一样了int main(int argc ,char * argv)int WinMain(HINSTANCEhInstance, HINSTANCE,LPSTR lpStr,int nShow)绝大多数的人,初次接触 Windows 编程都会被其冗长的名字所折服,啊,没方法,这.v.就是 Windows 的命名规格,叫匈牙利命令法,是微软的一个匈牙利籍的程序员创造的,它的作用的能够让变量,类型名能够真实的反
6、响其代表的意义, 这对英语人士自然很好。 对英语不好的承受起来就有点难了。详细解释一下WinMain 是 Windows 编程的主函数。一定注意大小写啊。HINSTANCE,用Windows 的说法叫句柄数据类型。但它并不是一个新的数据类型,它是通过*define 定义出来的。*define DECLARE_HANDLE(name) struct name*_int unused; typedefstruct name*_ *nameDECLARE_HANDLE(HINSTANCE);上面两行是 windef.h 中对 HINSTANCE 的定义。说到底 HINSTANCEHINSTANCE
7、就是一个指针类型就是一个指针类型。LPSTR 是 typedefchar *LPSTR。Windows 编程里有大量通过*define 和 typedef 定义出来的数据类型名。本质上它们都不是新的东西,都是以前我们在 C 语言学过的哪些数据类型另起了一个名字。为什么要这么做呢.一般 Windows 程序比较大,好的命名利于维护和防止错误。总之,说到底,旧壶装新酒,貌似多了很多数据类型,不要被它们吓到,它们就是比 C 语言你们学过的东西多穿了件马甲。第二课第二课 在窗口中显示在窗口中显示 HelloWorldHelloWorld 中中4 4 学时学时一、第一课的 HelloWorld 出现在网
8、页上。这不是我们的目的,我们要生成正常一点的HelloWorld。Windows 程序中要显示 HelloWorld 看来还不是太容易。(1) 将 HelloWorld 绘制到桌面补充说明如果要让这个程序顺利执行,需要写的容是 lgdi32运行的效果,helloworld 显示在桌面上了看到 HelloWorld 了吗。说明WinMain 是 Window 的主函数HDC 是个什么呢,本质上是个指针,但是我们不需要了解它指向了什么,因此,简而化之 HDC 是一个 32 位的无符号整数。HDC 叫设备上下文句柄。设备上下文指显示器屏幕或打印机什么的。句柄有点类似文件句柄的意思, 有了它才能操作设
9、备。在这里有了它才能向设备上绘制。所有涉及绘图的地方都涉及HDC。GetDC(窗口句柄)。如果使用 GetDC(NULL)得到桌面的设备上下文。否那么可以得到一个窗口的设备上下文,我们可以在窗口上进展绘制。(2) LPTSTR 是 TCHAR * 的另一个写法(3) TextOut 是 Windows API 的一个函数,功能是将文本写到设备上下文上。TextOut(HDC,横坐标,纵坐标,字符串,字符串长度)(4) ReleaseDC(窗口句柄,HDC)释放设备上下文GetDC 的得到的 HDC 一定要用 ReleaseDC 释放,否那么机器容易资源耗尽。二、在一个独立窗口中显示HelloW
10、orld, 这是重点了, 涉及一些 Windows 编程重要的容分如下几个步骤(1) 定义一个全局函数(2) 定义 WinMain 函数.v.(3) 在 WinMain 函数注册窗口类lpszClassName:自己取个名字,字母lpfnWndProc:函数指针,为我们在第一步定义的函数名。用强制类型转换在 Windows 中显示一个窗口,一定要先注册窗口类。函数式RegisterClassEx(&wc)(4) 创立并显示窗口(5) 建立消息循环(6) 补充处理 WM_PAINT,补充 WndProc 函数总结: 创立窗口的模式是根本是固定的, 本课的代码很大一局部就是这么写。 主要在 Wnd
11、Proc存在不同。涉及的 API 函数RegisterClassEx(&WNDCLASSEX)WinMain(HINSTACNE,HINSTANCE,LPSTR,int nShow)DefWindowProc(HWND,UINT,WPARAM,LPARAM)GetMessageLPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax).如果得到 WM_QUIT 返回 0TranslateMessage(&MSG)DispathMessage(&MSG)BeginPaint(&PAINTSTRUCT)TextOut(HDC,INT,I
12、NT,LPSTR,INT)EndPaint(HWND,&PAINTSTRUCT)作业:自己建立应用,在窗口 100,100 位置显示 HelloWorld第三课第三课 坐标位置及大小坐标位置及大小4 4 学时学时) )在我们写控制台应用的时候, 不能自由的控制输出显示的位置。 因此,没有学习过这方面的容,现在我们创立了窗口,并且在窗口上显示了 Hello World。这个过程涉及到很多涉及位置和大小的因素,如窗口的大小,显示的位置,文字显示的位置。说到位置,就涉及定位,说到定位就要说坐标系。在屏幕上显示容涉及到坐标空间的知识。在 Windows 应用中坐标空间分如下几局部容1、物理坐标空间物理
13、坐标空间,指的是物理设备上对应的坐标系。如显示器坐标原点在左上角。如下是一个1024*768 的屏幕物理坐标0,01024,00,7682、设备坐标空间基于设备上下文指定的坐标空间。 如窗口显示的文本, 使用的坐标就是基于窗口上下文的坐标。可以看到设备空间是物理空间体系的一个子空间。 设备空间可以依赖于一个窗口。 换句话可以把设备空间理解为在物理空间上显示的一个对象,其子空间。下面我们通过一个小例子理解物理空间和设备空间在窗口的标题条,以设备坐标,和物理坐标的形式显示鼠标在窗口的位置WndProc 处理消息循环WM_MOUSEMOVE,鼠标移动时消息标识,是个整数。其参数 lParam,的第
14、16 位代表设备.v.坐标中的 X,高 16 位代表设备坐标的 Y。是构造体。只有 x,y 两个成员.v.POINT.ClientToScreen,将设备坐标转换为屏幕坐标物理坐标)sprintf:格式化字符串SetWindowText:设 Window 标题3、页面坐标空间逻辑坐标空间的一种作用,可以任意指定坐标原点,坐标轴方向,比例尺等信息。可以用来与设备无关的大小如厘米,毫米等。页面坐标叫窗口,其表示有原点X,Y),宽度,高度组成(WIDTH,HEIGHT)设备坐标叫视口,其表示有原点x,y),宽度,高度组成(width,height)页面坐标和设备坐标的变换关系,大写为设备坐标,小写为
15、页面坐标PX=X+(px-x)*WIDTH/widthPY=Y+(py-y)*HEIGHT/heightpx=x+(PX-X)*width/WIDTHpy=y+(PY-Y)*heigh/HEIGHTGDI 函数使用页面坐标,显示出来时是设备坐标通过对窗口,是否对应的四个参数的设置,可以实现特殊的变换。页面坐标是逻辑坐标的一种。在这个例子中我们一直使用MoveToEx(ps.hdc,0,0,NULL);LineTo(ps.hdc,30,30);划线,MoveToEx 是把画笔移动到指定位置页面坐标),LineTo 是从画笔所在位置到目标位置画一条线。在这个例子中,每次划线前通过设置视口,窗口结果
16、使划线的结果不同。这种形式的坐标转换无法实现旋转4、世界坐标空间逻辑坐标空间的另一种功能:比页面坐标空间方便,可以实现旋转构造体XFORMFLOAT eM11,FLOAT eM12,FLOAT eM21,FLOAT eM21,FLOAT eDx,FLOAT eDy,世界坐标到设备坐标的变换。小写到大写。PX=eM11*px+eM21*py+eDx;PY=eM12*px+eM22*py+eDy;默认为1,0,0,1,0,0 和设备坐标一样1001dxdymx00my00缩放-100-100映像旋转cos(a),sin(a),-sin(a),cos(a),0,0顺时针旋转 a 度cos(a),-s
17、in(a),sin(a),cos(a),0,0逆时针旋转 a 度我们下面的例子通过 Rectangle(ps.hdc,0,0,50,50);绘制 50*50 的矩形, 用循环配合世界坐标变换绘制特殊的图形.v.循环 20 次,每次旋转坐标轴的方向,绘制正方形。总结:物理坐标指的是屏幕坐标,不能改变坐标轴设备坐标指的是窗口坐标,不能改变坐标轴页面坐标和世界坐标均是逻辑坐标,可以改变坐标轴,世界坐标功能更强, 可以旋转。理解这些概念的绘图是很重要的。相关函数BOOL ClientToScreen( HWND hWnd, LPPOINT lpPoint);设备坐标转屏幕坐标BOOL ScreenTo
18、Client( HWND hWnd,LPPOINT lpPoint);屏幕坐标转设备坐标int MapWindowPoints( HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints);各个窗口设备坐标之间的转换BOOL SetWindowOrgEx(HDC hdc, int X,int Y,LPPOINT lpPoint );设置窗口的原点SetViewportOrgEx(HDC hdc,int X,int Y,LPPOINT lpPoint);设置视口的原点BOOL SetViewportExtEx(HDC hdc, int
19、nXExtent, int nYExtent,LPSIZE lpSize);设置视口的 width,heightBOOL SetWindowExtEx(HDC hdc, int nXExtent,int nYExtent,LPSIZE lpSize);设置窗口的 width,heightSetMapMode 设置页面坐标的映射模式SetGraphicsMode 设置世界坐标的映射模式Rectangle 绘制矩形,并填充部SetWorldTransform 设置世界坐标变换LineTo:换线MoveToEx:移动画笔SetWindowText 设置窗口标题LPtoDP(hdc,LPPOINT,i
20、nt)把逻辑坐标点转换为设备坐标点作业:使用 movetoex,lineto,LPtoDP 及世界坐标变换,绘制正六边形提示:画一条水平线后,将坐标原点移动到线的末尾,并将坐标轴旋转60 度*n,重复上步要将坐标移动到线尾需要使用LPtoDP第四课第四课 色彩及绘制色彩及绘制6 6 学时学时1画点像素:计算机屏幕上的一个点。 是计算机屏幕显示的最小单位。 点的个数取决于计算机的分辨率。如 1024*768,那么屏幕由 1024*768 个点组成。每个点都可以独立的显示一个颜色。计算机能够表示的颜色有256*256*256=16777216种。颜色的表示 COLORREF 。定义颜色 RGBCO
21、LORREF color=RGB(红,绿,蓝)随机绘制颜色点.v.需要*includesrand:随机种子函数,传递的参数不同,可以生成不同的随机数序列GetTickCount(): API 函数,得到系统开机后到现在的滴答数,特点就是每次返回的结果不重复。两者的配合得到不重复的随机数序列rand 得到函数SetPixel 设置某点的颜色(2)画线在以前的例子里我们一直用1 个像素宽的黑色实现来画线。 现在我们学习创立画笔, 用画笔来画线。步骤 1、创立画笔 CreatePen(画笔类型,宽度,颜色)2、将画笔选入设备上下文SelectObject3、用画笔绘制4、将画笔选出设备5、删除创立的
22、画笔对象SelectObject 是将 GDI 对象画笔选入设备上下文,并将当前的选出返回。因此我们两次使用SelectObject,最后一个将以前的画笔选入,返回我们创立的,并在下一步删除画笔。虚线只能支持宽度 1.画线函数Polygon(HDC,LPPOINT,INT).连接指定点,画多边形,封闭。如果画4 边形那么确认 3 个点即可。Polyline(HDC,LPPOINT,INT).连接指定点,画多边,不封闭MoveToEx:移动画笔LineTo:用当前的画笔划线Arc:画圆弧 BOOL Arc(HDC hdc,int nLeftRect,int nTopRect,int nRight
23、Rect,intnBottomRect,int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc);前 4 个是画圆弧的矩形,后四个指定了弧开场和完毕的位置作业:画一条正弦曲线使用 SexPixel,LineTo,MoveToEx实现(3)画面画面就是用画刷来填充步骤1、创立画刷 CreateSolidBrush(颜色)2、将画刷选入设备上下文SelectObject3、用画刷填充4、将画刷选出设备5、删除创立的画刷对象用蓝色画刷填充矩形,矩形的边框是黑色。CreateSolidBrush:创立颜色画刷Rectangle:绘制矩形,用当前的
24、Pen 绘制边框,用当前的 Brush 来填充矩形部FillRect:画刷填充矩形。FillRect(hdc,&RECT,HBRUSH)使用 FillRect 不绘制边框,因为参数中有画笔,也不用SelectObject 了。Ellipse:椭圆,圆。画边框,填充.v.Pie:圆饼(4)位图将文件系统中的位图显示到窗口中。绘制位图步骤1、根据现有的设备上下文创立兼容的设备上下文2、加载位图3、绘制图像4、删除加载的位图5、删除兼容的设备上下文BitBlt 是在设备上下文之间拷贝图像的函数,非常常用在上一个列子的根底上,得到位图的大小并绘制实际大小的位图作业:在一个窗口上显示一副位图文件(*.b
25、mp)。(5)字体和文本创立逻辑字体并显示文本步骤1、创立逻辑字体2、选入字体3、输出文本4、选出字体5、删除字体另一个与文本绘制有关的功能更强的函数是DrawText总结:本课介绍了一些根本的绘图操作, 其中涉及了较多的函数, 这里只是介绍了根本的使用方式和原理。函数srandrandGetClientRectSetPixelLineToMoveToExCreatePenCreateSolidBrushCreateFontIndirectBitBltSelectObjectDeleteObjectCreateCompatibleDCLoadImageRectangleFillRectDele
26、teDC等等。.v.第五课第五课 常用控件的使用常用控件的使用6 6 学时学时在上面的几节课程中我们学习了如何建立 Windows 应用,并在图形环境下绘制图形。这些操作都是控制台应用中没有的。 本章我们介绍如何在窗口中参加按钮等常规控件, 并且处理它们。一般控件种类,按钮,列表组合,编辑,列表,滚动条,静态文本。控件是一种特殊的窗口。这些特殊窗口的类已经由 Windows 系统注册了,不需要我们注册。这些类的名字分别为。BUTTON,COMBOBOX,EDIT,LISTBOX,SCROLLBAR,STATIC(1) 创立任何时候均可,但通常在WM_CREATE 事件中处理WM_CREATE
27、是在窗口创立时触发WM_DESTORY 是在窗口销毁时触发控件用 CreateWindow 创立, 返回控件窗体的句柄, 窗体的类型一定为 WS_CHILDWINDOW。附加的类型以或关系叠加。具体要参见MSDN(2) 操控控制这些控件是通过向这些控件的窗体句柄发送特点消息来实现的如 SendMessage(控件句柄,消息指,参数 1,参数 2)具体设置参见 MSDN在上面的例子,我们处理下拉列表的时候使用了SendMessage 发送消息(3) 反响我们操作控件会触发控件的事件得到一些反响, 下面介绍如何得到这些反响。 总体上,我们把这些反响过程叫通知。 通知的过程是将反响发送给父窗体, 一
28、般父窗体有两个事件接收控件的反响WM_NOTIFY,WM_COMMAND。WM_COMMANDHIWORD(wParam)通知消息号LOWORD(wParam)控件标识WM_NOTIFYwParam :控件标识lParam:NHMDR 的指针比方按钮的单机对应的事件是BN_CLICKED。该事件通过 WM_COMMAND通知。我们把上个例子补充完整,并且为每个控件指定ID,指定的方式是在(HMENU)的后面写个整数,原那么上应该不同。HIWORD,得到一个字的高字节。LOWORD 得到一个字的低字节。(4) 通用控件我们上面介绍的是根本的控件, 除了这些根本控件外还有一些通用控件。 这些控件的
29、使用和处理和根本的控件差不多,但功能更强大。ANIMATE_CLASS : 动画控件,播放 AVI 动画DATETIMEPICK_CLASS :日期时间下拉控件HOTKEY_CLASS :定义热键的控件MONTHCAL_CLASS : 月份选择控件PROGRESS_CLASS :进度条控件REBARCLASSNAME :rebar 控件.v.STATUSCLASSNAME:状态条控件TOOLBARCLASSNAME :工具条TOOLTIPS_CLASS :提示控件TRACKBAR_CLASS :轨迹条UPDOWN_CLASS :上下箭头WC_COMBOBOXEX :组合框扩展WC_HEADER
30、 :头控件WC_IPADDRESS :IP 地址控件WC_LISTVIEW :listview 控件WC_PAGESCROLLER :页滚动控件WC_TABCONTROL :tabControl 控件WC_TREEVIEW :树视图控件通用控件在使用前使用 InitCommonControlsEx初始化。使用这些通用控件要 include 同时在连接时要连接 comctl32.dll头部这些控件和 IE 有关系,根据 IE 版本不同,控件的外观和功能有区别。(5) 创立菜单CreateMenu:创立一个菜单CreatePopupMenu:创立一个子菜单AppendMenu:向菜单增加工程Set
31、Menu:将菜单联系到窗口第六课第六课 进程及线程进程及线程2 2 学时学时进程:是一个正在运行的程序的实例。由两个局部组成1、一个是操作系统用来管理进展的核对象。核对象是系统用来存放关于进程信息的地方。2、地址空间,每个进展都有自己的地址空间进程本身不执行代码,进程要至少拥有一个线程, 由线程来执行代码。每个线程都拥有自己的 CPU 存放器和堆栈。当创立一个进程时系统会自动创立一个主线程。CreateProcess 创立进程部执行细节:1 创立一个小的构造存放进程信息2 分配地址空间3 创立一个小的构造存放线程信息4 执行 C/C+启动代码,最终会调用WinMain 或 main。完毕一个进
32、程 TerminateProcessTerminateProcess1使用 ToolHelp 遍历系统进程列举系统全部的进程需要*include *include using namespace std;.v.线程线程由两个局部组成1核对象2线程堆栈,用于维护执行代码时所有的函数参数和局部变量进程是活波的, 进程不执行任何东西, 它是线程的容器。 线程在进程的地址空间中执行代码。如果一个进程拥有多个线程那么这些线程共享进程地址空间的代码和数据。 进程的地址空间要比线程占用更多的系统资源, 因此要更多的使用线程。 每个线程必须有个入口点函数, 主线程是 main,WinMain。如果要创立一个线
33、程,那么这个线程的函数原型是这样的。DWORD WINAPI ThreadProc(PVOID pvParm)return value;因为线程会共享全局变量,因此多线程应该少使用全局变量1线程创立线程的创立不能直接使用CreateThread API 函数。而要使用 C 编译环境自带的创立进程函数。*include unsigned uThreadid=0;uintptr_t hThread=_beginthreadex(NULL, 0,ThreadProc,NULL,CREATE_SUSPENDED,&uThreadid);第 3 个参数是线程函数地址, 第 4 个参数是传递到线程的LPV
34、OID,第 5 个参数为 0 线程马上运行、CREATE_SUSPENDED需要激活才能运行。最后一个保存线程的ID进程和线程 ID 是一个标识。不重复。进程和线程对象是系统对象,关闭这些对象对进程和线程的运行没有影响。第第 7 7 课课 线程的调度和同步线程的调度和同步6 6 学时学时) )线程暂停:创立时使用 CREATE_SUSPENDED创立一个暂停的线程使用 SuspendThread 暂停线程长时间不使用窗体恢复线程:ResumeThreadResumeThread 和 SuspendThread 使用次数要对应。休眠线程 Sleep(毫秒)线程的同步是比较容易出错的地方,要多多实
35、践和理解。参见线程冲突的例子。每个线程对变量 g 累加 10000 次,创立6 个线程,这是其中一次的运行结果。可以看到结果不是 60000.对线程冲突问题的解释一条C 的 g+对应的汇编指令为 3 条mov eax,ginc eaxmov g,eax.v.如果我们创立两个线程,这两个线程将共享上面的代码。如果只有一个CPU 的话,那同一时刻只能志执行一条汇编指令。但 Windows 的调度机制可以保证代码按顺序执行,但不能保证不被打断。举例g=0mov eax,g/1eax=0inc eax/1eax=1mov g,eax/1g=1 eax=1mov eax,g/2eax=1inc eax/
36、2eax=2mov g,eax/2g=2 eax=21 和 2 两个线程分别执行上面的 3 行代码,那么 g 被加了两次,得到 2。但实际上这是多线程的特例。真实的情况是CPU 下条要执行那个线程的代码是随机的。如下g=0mov eax,g/1eax=0inc eax/1eax=1mov eax,g/2eax=0inc eax/2eax=1mov g,eax/2g=1 eax=1mov g,eax/1g=1 eax=1线程 1 在增加后没有及时赋值给 g,然后线程 2 执行。最后 g 为 1。这就是线程没有同步导致的问题,也是我们程序中出现的问题。解决方法1原子操作函数使用 Interlock
37、edExchangeAdd,加减InterlockedExchange 赋值InterlockedCompareExchange比较赋值使用这些函数加减变量,保证只有执行完后其他进程才能进入。结果是 60000 了,但是按理应该输出六次线程运行了完毕了。但只显示两次,其实每次的结果多不会一样。这也是并发带来的问题。解决方法2关键代码段在使用关键段之前使用该函数输出了 6 次,但每次对应的g 值不一定以 10000 递增。如果把进入关键段的位置提前到最前面可以得到常规的理解这时这 6 个进程某种意义上没有并发执行。局限:关键代码段只能在一个进程使用,没有等待时长的限制容易死锁。解决方法3 核对象
38、具备通知状态的核对象进程线程作业文件修改通知事件.v.可等待定时器文件信标控制台输入互斥对象举个例子取消注释后,一次显示一个。表达了该函数对线程的控制。(1)事件控制尽管 WaitForSingleObject 可以等待很多对象的反响,但其主要还是用来处理事件等对象。事件是一种核对象,有两个状态,一个用于表示该事件是自动重置事件还是人工重置事件。人工重置事件等待该事件的线程都会得到通知, 自动重置事件只有一个线程会得到通知。 另一个是事件的通知状态。一是未通知状态线程等待,一个是已通知状态,线程运行。CreateEvent( NULL,自动false还是手工true,通知true未通知fals
39、e。HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPTSTR lpName ); 最后一个是为事件起个名字,同名事件不能建立两次。保证同名事件只能建立一次,可以为空。SetEvent:设为已通知状态ResetEvent:设为未通知状态OpenEvent:翻开一个已经存在的时间,返回Handle创立自动通知,立即通知事件对自动通知事件 SetEvent 有意义,对手工通知事件无意义。手工通知同时显示 6 个窗口,自动通知一次显示1 个(2)信标核对象使用信标可以确定让几个线程同时运行CreateSemaphore(NULL,初始数,最大数,名称)OpenSemaphore最多同时有 3 个线程运行。(3)互斥对象互斥对象和关键代码段的作用一样, 效率比关键代码段低。 但运行不同进程间使用互斥对象,同时可以设置最大的等待时长。 互斥对象和其他核对象的区别, 互斥对象可以记录调用的线程 ID,一旦线程得到该对象同线程的其他地方的等待将不会等待。CreateMutex(NULL,初始等待,名称)OpenMutex(0,NULL,名称)ReleaseMutex(HANDLE),只能是否本线程得到的对象.v.
限制150内