估计是系统后台资源有限,单进程中只支持16个。相关的官方文章中没有类似说明。附上整理的代码
typedef bool (*pWinThreadCallbackFun)(void* pUser);
static volatile long m_nTotalThreadCount;
void CALLBACK CRython_MMTimer::TimerHandler(UINT id, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
CMMTimer* pThis = (CMMTimer*)dwUser;
pThis->m_pThreadCallbackFun(pThis->m_pUser);
}
UINT CMMTimer::CreateTimer(int nSleepMS)
{
timeBeginPeriod(timeRes);
UINT timerID = timeSetEvent(
nSleepMS,
timeRes,
TimerHandler,
(DWORD)this,
TIME_PERIODIC);
return timerID;
}
BOOL CMMTimer::Start(pWinThreadCallbackFun pWinThreadCallbackFun,void* pUser,int nSleepMS)
{
BOOL bFlag = FALSE;
if (!m_bThreadRuning)
{
m_bThreadRuning =TRUE;
m_pThreadCallbackFun=pWinThreadCallbackFun;
m_pUser=pUser;
hTimer = CreateTimer(nSleepMS);
if(NULL != hTimer)
{
InterlockedIncrement(&m_nTotalThreadCount);
bFlag = TRUE;
}
else
{
int eror = GetLastError();//创建第17个,显示183错误
m_bThreadRuning=FALSE;
}
}
return bFlag;
}
void CMMTimer::Stop()
{
if (m_bThreadRuning)
{
m_bThreadRuning=FALSE;
timeKillEvent(hTimer);
timeEndPeriod(timeRes);
InterlockedDecrement(&m_nTotalThreadCount);
timeRes = 1;
hTimer = 0;
}
}