使用信号量对象

【勇芳软件工作室】汉化HomePreviousNext

在以下示例中,进程使用信号量对象来限制其创建的窗口数。首先,它使用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) ) //对以前的计数不感兴趣

{

//处理错误。

}