第三章:快跑与等待
1.绝对不要在win32中使用busy loop。
2.等待一个线程的结束:
DWORD WaitForSingleObject(
HANDLE hHandle, //等待对象的handle
DWORD dwMilliseconds //等待时间,时间终了,即使handle尚未激发,此函数还是要返回。0立刻返回,INFINITE无穷等待
);
函数失败:返回WAIT_FAILED
函数成功:
(1)等待的目标核心对象变成激发状态,返回值为WAIT_OBJECT_0
(2)核心对象激发之前,等待时间终了,返回值为WAIT_TIMEOUT
(3)如果一个拥有mutex的线程结束前没有释放mutex,则传回WAIT_ABANDONED
3.核心对象激发的意义
(1)Thread :线程运行时处于未激发状态,线程结束对象被激发。对象由CreateThread或CreateRemoteThread产生。
(2)Process:进程运行时处于未激发状态,进程结束对象被激发。对象由CreateProcess或OpenProcess产生。
(3)Change Notification:当一个特定的磁盘子目录发生变化时,此对象即被激发。此对象由FindFirstChangeNotification产生。
(4)Console Input:当console窗口输入缓冲区中有数据可用时,此对象处于激发状态。CreateFile、GetStdFile产生console handle。
(5)Event:对象的状态受控于3个win32函数:SetEvent,PulseEvent,ResetEvent。CreateEvent、OpenEvent可以传回一个Eventobject handle。Event对象的状态也可以被操作系统设定---如果使用与overlapped操作时。
(6)Mutex:如果Mutex没有被任何线程拥有,就是处于激发状态。一旦一个等待mutex的函数返回了,mutex自动重置为未激发状态。CreateMutex、OpenMutex可以获得一个mutex handle。
(7)Semaphore:有个计数器,约束拥有者个数。计数器大于0,semaphore处于激发状态;等于0,处于未激发状态。CreateSemaphore,OpenSemaphore可以传回一个semaphore handle。
补充说明(3):这些变化指的是:
FILE_NOTIFY_CHANGE_FILE_NAME 产生、删除、重新命名一个文件
FILE_NOTIFY_CHANGE_DIR_NAME 产生或删除一个子目录
FILE_NOTIFY_CHANGE_ATTRIBUTES 目录及子目录中的任何属性改变
FILE_NOTIFY_CHANGE_SIZE 目录及子目录中的任何文件大小的改变
FILE_NOTIFY_CHANGE_LAST_WRITE 目录及子目录中的任何文件的最后写入时间的改变
FILE_NOTIFY_CHANGE_SECURITY 目录及子目录中的任何安全属性改变
4.等待多个对象
DWORD WaitForMultipleObjects(
DWORD nCount, //表示lpHandles所指之handles数组的元素个数。最大容量是MAXIMUM_WAIT_OBJECTS
CONST HANDLE *lpHandles, //指向一个由对象handles所组成的数据,这些handles不需要为相同的类型。
BOOL bWaitAll, //True表示所有的handles都必须激发,函数才返回。否则此函数将在任何一个handle激发返回。
DWORD dwMilliseconds //等待时间
);
返回值:
(1)如果因时间终了返回,返回值为WAIT_TIMEOUT
(2)如果bWaitAll为True,返回值为WAIT_OBJECT_0
(3)如果bWaitAll为False,则将返回值减去WAIT_OBJECT_0,就表示数组中的哪个handle被激发了
(4)如果等待的对象中有任何的Mutex,返回值可能从WAIT_ABANDONED_0 到 WAIT_ABANDONED_0 + nCount - 1.
(5)如果函数失败,传回WAIT_FAILED.
5.MsgWaitForMultipleObjects: “对象被激发” 或 “消息到达队列” 时被唤醒而返回
DWORD MsgWaitForMultipleObjects(
DWORD nCount,
LPHANDLE pHandles,
BOOL fWaitAll,
DWORD dwMilliseconds,
DWORD dwWakeMask //欲观察的用户输入消息
);
输入消息:
QS_ALLINPUT
QS_HOTKEY
QS_INPUT
QS_KEY
QS_MOUSE
QS_MOUSEBUTTON
QS_MOUSEMOVE
QS_PAINT
QS_POSTMESSAGE
QS_SENDMESSAGE
QS_TIMER