windowns--HANDLE, 我不是女神ヾ 2021-10-24 01:28 265阅读 0赞 **HANDLE:** 在windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为他们分配内存,并返回标示这些资源的标示号,即句柄。 句柄指的是一个核心对象在某一个进程中的[唯一索引][Link 1],而不是[指针][Link 2]。 由于[地址空间][Link 3]的限制,句柄所标识的内容对进程是不可见的,只能由操作系统通过进程句柄列表来进行维护。句柄列表:每个进程都要创建一个句柄列表,这些句柄指向各种系统资源,比如[信号量][Link 4],[线程][Link 5],和文件等,进程中的所有线程都可以访问这些资源。 其实我们编程时输出一下句柄的值就可以发现这些值往往非常小(<100)。由此就可以看出 [句柄][Link 6]的性质了。 无效的返回值为: INVALID\_HANDLE\_VALUE 编程时可作调试用: HANDLE:句柄,是windows用来表示对象的(不是C++的对象),HWND是其中一种。 HANDLE是一个通用句柄表示,HWND是一个专用表示窗口的句柄。 **CreateThread:** ** **Windows API函数,该函数再主线程的基础上创建一个新线程。 **WaitForMultipleObjects:** ** **WaitForMultipleObjects:几乎可以等待Windows中的所有的内核对象。 原型:DWORD WaitForMultipleObjects(DWORD nCount,const HANDLE\* lpHandles,BOOL bWaitAll,DWORD dwMilliseconds); WaitForSingleObject的返回值能够指明调用线程为什么再次变为可调度状态。如果线程等待的对象变为已通知状态,那么返回值是 WAIT\_OBJECT\_0。如果设置的超时已经到期,则返回值是WAIT\_TIMEOUT。如果将一个错误的值(如一个无效句柄)传递给 WaitForSingleObject,那么返回值将是WAIT\_FAILED(若要了解详细信息,可调用GetLastError) **nCount**参数用于指明想要让函数查看的内核对象的数量。这个值必须在1与MAXIMUM\_WAIT\_OBJECTS(在Windows头文件中定义为64)之间。 **lpHandles**参数是指向内核对象句柄的数组的指针。 可以以两种不同的方式来使用WaitForMultipleObjects函数: 一种方式是让线程进入等待状态,直到指定内核对象中的任何一个变为已通知状态。 另一种方式是让线程进入等待状态,直到所有指定的内核对象都变为已通知状态。 **bWaitAll**参数告诉该函数,你想要让它使用何种方式。如果为该参数传递TRUE,那么在 **所有对象**变为已通知状态之前,该函数将不允许调用线程运行。 WaitForMultipleObjects函数的返回值告诉调用线程,为 什么它会被重新调度。可能的返回值是WAIT\_FAILED和WAIT\_TIMEOUT,这两个值的作用是很清楚的。如果fWaitAll参数传递 TRUE,同时所有对象均变为已通知状态,那么返回值是WAIT\_OBJECT\_0。 如果为fWaitAll传递FALSE,那么一旦任何一个对象变为已 通知状态,该函数便返回。在这种情况下,你可能想要知道哪个对象变为已通知状态。返回值是WAIT\_OBJECT\_0 与(WAIT\_OBJECT\_0 + dwCount-1)之间的一个值。换句话说,如果返回值不是WAIT\_TIMEOUT,也不是WAIT\_FAILED,那么应该从返回值中减去 WAIT\_OBJECT\_0。产生的数字是作为第二个参数传递给WaitForMultipleObjects的句柄数组中的索引。该索引说明哪个对象变 为已通知状态。 **dwMilliseconds参数**的作用与它在WaitForSingleObject中的作用完全相同。如果在等待的时候规定的时间到了,那么该函数无论如何都会返回。同样,通常为该参数传递INFINITE,但是在编写代码时应该小心,以避免出现死锁情况。 **WaitForSingleObject** DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds); 有两个参数,分别是THandle和Timeout(毫秒单位),hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。 WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为**INFINITE**时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码 它可以等待如下几种类型的对象: Event,Mutex,Semaphore,Process,Thread 有三种返回类型: WAIT\_OBJECT\_0, 表示等待的对象有信号(对线程来说,表示执行结束); WAIT\_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完); WAIT\_ABANDONED 表示对象有信号,但还是不能执行 一般是因为未获取到锁或其他原因 **CreateMutex** 作用是找出当前系统是否存在指定进程的实例。如果没有则创建一个互斥体。 CreateMutex()函数可用来创建一个有名或无名的 [互斥量][Link 7]对象,其函数原型为: HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 BOOL bInitialOwner, // 初始化互斥对象的所有者 LPCTSTR lpName // 指向互斥对象名的指针 ); 如果函数成功执行,将返回一个互斥量对象的句柄。**如果在CreateMutex()执行前已经存在有相同名字的互斥量,函数将返回这个已经存在互斥量的句柄**,并且可以通过GetLastError()得到错误代码ERROR\_ALREADY\_EXIST。可见,通过对错误代码ERROR\_ALREADY\_EXIST的检测可以实现CreateMutex()对进程的互斥。 建立互斥体,用来同步。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。 参数: lpMutexAttributes 指向一个SECURITY\_ATTRIBUTES结构的指针,这个结构决定互斥体句柄是否被子进程继承。 bInitialOwner 布尔类型,决定互斥体的创建者是否为拥有者 lpName 指向互斥体名字字符串的指针。互斥体可以有名字。 如果一个线程拥有了一个互斥对象后,当该线程运行完成后就要释放该互斥对象,不然其他的线程得不到互斥对象则无法运行 用ReleaseMutex(HWND); **注意:** 一旦不再需要,注意必须用CloseHandle函数将 [互斥体][Link 8]句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象 ** LPVOID** LPVOID,是一个没有类型的指针,你可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递),然后在使用的时候再转换回来。 转载于:https://www.cnblogs.com/Caden-liu8888/p/5919698.html [Link 1]: http://baike.baidu.com/view/709651.htm [Link 2]: http://baike.baidu.com/view/159417.htm [Link 3]: http://baike.baidu.com/view/1507129.htm [Link 4]: http://baike.baidu.com/view/1303265.htm [Link 5]: http://baike.baidu.com/view/1053.htm [Link 6]: http://baike.baidu.com/view/194921.htm [Link 7]: http://baike.baidu.com/view/8465939.htm [Link 8]: http://baike.baidu.com/view/3074680.htm
还没有评论,来说两句吧...