我的表达能力就达到这种程度了。接下来我会用Console程序和一个管理多句柄对象的类来实现上面的算法。文章长了点, 一部分发表不了。源码在《Win32下对多个的线程句柄的关闭的控制(下)》给出。
下面是CMultipleHandles和一个基于Console的源码。
// MultipleHandles.h
// 作者: 黄瑞广 时间: 2004-02-06
// 说明: 本类不支持线程安全
class CMultipleHandles
{
private:
int m_nNumOfHandle;
public:
HANDLE m_arrayHandle[MAXIMUM_WAIT_OBJECTS];
...........
};
// MultipleHandles.cpp
#include "stdafx.h"
#include "MultipleHandles.h"
CMultipleHandles::CMultipleHandles()
{
Init();
}
void CMultipleHandles::Init()
{
m_nNumOfHandle = 0; // 句柄数为"0"
for (int i = 0; i < MAXIMUM_WAIT_OBJECTS; i++)
m_arrayHandle[i] = NULL; // NULL表示该句柄位可用
}
// 功能: 判断句柄槽位是否是空
// 返回值: TRUE, 空; FALSE, 不空
BOOL CMultipleHandles::IsEmpty()
{
if (m_nNumOfHandle == 0)
return TRUE;
return FALSE;
}
// 功能: 判断句柄槽位是否已满
// 返回值: TRUE, 已满; FALSE, 未满
BOOL CMultipleHandles::IsFull()
{
if (m_nNumOfHandle == MAXIMUM_WAIT_OBJECTS)
return TRUE;
return FALSE;
}
// 功能: 获得可用槽位的索引值
// 返回值: -1, 没有可用的槽位; 否则是空槽位的索引
int CMultipleHandles::GetFree()
{
int nIndex;
if (IsFull())
return -1; // 整个句柄槽没有可用的槽位, 返回-1
for (int i = 0; i < MAXIMUM_WAIT_OBJECTS; i++)
{
if (m_arrayHandle[i] == NULL)
{
nIndex = i;
break;
}
}
return nIndex;
}
// 功能: 获得句柄槽中句柄的个数
// 返回值: 句柄个数
int CMultipleHandles::GetNumOfHandle()
{
return m_nNumOfHandle;
}
// 功能: 把一个句柄插入到句柄槽中
// 参数: 句柄, 作为输入
// 返回值: -1, 线程槽已满,插入失败; 成功, 返回插入索引值
int CMultipleHandles::Insert(const HANDLE hParam)
{
int nIndex;
nIndex = GetFree();
if (nIndex == -1)
return -1;
m_arrayHandle[nIndex] = hParam;
m_nNumOfHandle++;
return nIndex;
}
// 功能: 清除句柄槽中指定的句柄
// 参数: 输入, 句柄索引
// 返回值: TRUE, 成功; FALSE, 失败
BOOL CMultipleHandles::Clear(int nIndex)
{
if (IsEmpty())
return FALSE;
m_arrayHandle[nIndex] = NULL;
m_nNumOfHandle--;
return TRUE;
}