我想设计一个线程,来处理一个定时器队列,如何处理才会比较高效??
我遇到的问题:
1.如果单独用一个循环来处理,对每个定时器采用一个无限时间的等待,会很占用CPU,而且如果再在定时器队列中添加一个定时时间比当前小的定时器,就会得不到相应.定时器队列需要按照从小到大的时候排序
2.windows系统每隔20ms,就切换到系统空间去,检查内核对象的状态,我如何设计一个等待定时器报时的等待时间(我暂且设为25ms).
3.假设丢列中已经一个定时器,我通过检查其还剩余的时间(dwMilliseconds)与25ms比较,如果比25ms还要大,让线程去等待一个事件(等待时间为dwMilliseconds - 25).如果定时器队列中有个定时时间更小的定时器,我就触发上述的事件,让线程继续运行.(本来我是用Sleep来处理的,但我没有办法来唤醒它)
4.如果定时器队列中没有定时器,那么线程就等一个队列不为空的事件.
5.下面是线程的函数体,哪位大侠设计过类似的东西的,告诉我心得,我需要更好改进我的这个设计.如果谁需要完整代码,留下email,我给你们发过去.
while(m_isRun)
{
int length = m_timerlist.size() ;
if(0 == length)
m_eventHaveTimer.Wait ();
for(int i = 0;i < length;i++)
{
TTimer * pTimer = m_timerlist[i];
ASSERT_POINTER(pTimer,TTimer);//pTimer must not be NULL
DWORD dwStartTime = pTimer->GetStartTime ();
DWORD dwCurrentTime = ::GetTickCount ();
DWORD dwTime = pTimer->GetTime ();
if(dwTime > dwCurrentTime - dwTime)
{
DWORD dwMilliseconds =
pTimer->GetTime () - (dwCurrentTime - dwStartTime);
if(dwMilliseconds > 25 )
{
switch(m_eventSmallerTimer.Wait ())
{
case WAIT_FAILED:
break;
case WAIT_OBJECT_0:
m_eventSmallerTimer.Reset ();
break;
case WAIT_TIMEOUT: //Sleep(dwMilliseconds - 25);
break;
}
}
}
DWORD ret = ::WaitForSingleObject (pTimer->GetHandle (),0);
if( WAIT_FAILED == ret)
{
Erase(pTimer);
continue;
}
else if( WAIT_TIMEOUT == ret)
{
continue;
}
else if( ret == WAIT_OBJECT_0 )
{
CString str;
DWORD time = pTimer->GetTime ();
DWORD realtime = pTimer->GetRealTime ();
str.Format (
"timer:0x%X arrive at here! Time:%dms RealTime:%dms %f\n",
pTimer,time,realtime,fabs((double)realtime - time) *
100 / time);
Erase (pTimer);
TRACE0(str);
}
}//end for
}//end while