在以下示例中,进程使用信号量对象来限制其创建的窗口数。首先,它使用CreateSemaphore函数创建信号量并指定初始和最大计数。
HANDLE hSemaphore;
LONG cMax = 10;
LONG cPreviousCount;
//创建一个初始值和最大值的信号量。计数10。
hSemaphore = CreateSemaphore(
NULL, //没有安全属性
cMax, //初始计数
cMax, //最大计数
NULL); //未命名的信号量
if (hSemaphore == NULL)
{
//检查错误。
}
在任何进程的线程创建一个新窗口之前,它使用WaitForSingleObject函数来确定信号量的当前计数是否允许创建其他窗口。等待函数的超时参数设置为零,因此如果信号量未被指定,函数将立即返回。
DWORD dwWaitResult;
//尝试进入信号门。
dwWaitResult = WaitForSingleObject(
hSemaphore, //信号量处理
0L); //零秒超时间隔
switch(dwWaitResult){
//发出信号量对象。
case WAIT_OBJECT_0:
//确定打开另一个窗口。
break;
//信号量是非信号的,所以发生超时。
case WAIT_TIMEOUT:
//无法打开另一个窗口。
break;
}
当线程关闭窗口时,它使用ReleaseSemaphore函数来增加信号量的计数。
//增加信号量的计数。
if(!ReleaseSemaphore(
hSemaphore, //信号量处理
1, //增加一个计数
NULL) ) //对以前的计数不感兴趣
{
//处理错误。
}