16,472
社区成员
发帖
与我相关
我的任务
分享
#define THREAD_NUM (3) //线程数
typedef unsigned int DIS_ID_t;
enum TIMER_TYPE
{
E_TIMER_1,
E_TIMER_2,
E_TIMER_3,
};
class CPrint
{
public:
CPrint()
{
InitializeCriticalSection( &m_cs );
}
~CPrint()
{
DeleteCriticalSection( &m_cs );
}
void Print(std::string str)
{
::EnterCriticalSection(&m_cs);
std::cout << str.c_str() << std::endl;
::LeaveCriticalSection(&m_cs);
}
static CPrint *Instannce()
{
if (NULL == m_CPrint)
{
return m_CPrint = new CPrint;
}
return m_CPrint;
}
private:
static CPrint *m_CPrint;
CRITICAL_SECTION m_cs;
};
CPrint *CPrint::m_CPrint = NULL;
DWORD __stdcall ThreadPro( void* pArguments );
class CThread
{
public:
CThread()
{
}
~CThread()
{
}
void InitData(void)
{
m_hThreadPool = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,0);
for (int i=0; i<THREAD_NUM; i++)
{
m_Thread[i] = CreateThread( NULL,0,ThreadPro,NULL,0,NULL );
}
}
static HANDLE m_hThreadPool;
static OVERLAPPED m_ThreadOvl;
private:
HANDLE m_Thread[THREAD_NUM];
};
HANDLE CThread::m_hThreadPool = NULL;
OVERLAPPED CThread::m_ThreadOvl;
DWORD __stdcall ThreadPro( void* pArguments )
{
while (1)
{
DWORD dwTrans;
DWORD dwKey;
LPOVERLAPPED ovlop;
BOOL bRet = GetQueuedCompletionStatus( CThread::m_hThreadPool,&dwTrans,(PULONG_PTR)&dwKey,&ovlop,INFINITE );
if(bRet)
{
DIS_ID_t disID = *((DIS_ID_t *)dwKey);
if (disID == E_TIMER_1)
{
CPrint::Instannce()->Print("++++++++定时器1");
}
else if (disID == E_TIMER_2)
{
CPrint::Instannce()->Print("++++++++定时器2");
}
else
{
CPrint::Instannce()->Print("++++++++定时器3");
}
}
else
{
break;
}
}
return 0;
}
struct stTimer
{
DIS_ID_t m_Type;
DWORD m_LastTime;
DWORD m_Interval;
};
int _tmain(int argc, _TCHAR* argv[])
{
CThread thread;
thread.InitData();
std::vector<stTimer> timerList;
stTimer timer1,timer2,timer3;
DWORD initTime = (DWORD)time(NULL);
timer1.m_LastTime = initTime;
timer1.m_Interval = 10; //10秒
timer1.m_Type = E_TIMER_1;
initTime = (DWORD)time(NULL);
timer2.m_LastTime = initTime;
timer2.m_Interval = 60; //60秒
timer2.m_Type = E_TIMER_2;
initTime = (DWORD)time(NULL);
timer3.m_LastTime = initTime;
timer3.m_Interval = 60; //60秒
timer3.m_Type = E_TIMER_3;
timerList.push_back(timer1);
timerList.push_back(timer2);
timerList.push_back(timer3);
unsigned int i = 0;
while (i < 0xffff)
{
DWORD curTime = (DWORD)time(NULL);
std::vector<stTimer>::iterator it = timerList.begin();
for (; it != timerList.end(); it++)
{
DWORD interval = curTime - it->m_LastTime;
if (interval > it->m_Interval)
{
DIS_ID_t disID = it->m_Type;
PostQueuedCompletionStatus( CThread::m_hThreadPool,sizeof(disID),(DWORD)(INT_PTR)&disID,&CThread::m_ThreadOvl);
it->m_LastTime = curTime;
if (it->m_Type == E_TIMER_1)
{
CPrint::Instannce()->Print("---------------定时器1");
}
else if (it->m_Type == E_TIMER_2)
{
CPrint::Instannce()->Print("---------------定时器2");
}
else
{
CPrint::Instannce()->Print("---------------定时器3");
}
}
}
if ((i % 8) == 0)
{
CPrint::Instannce()->Print("oooooooooo");
}
i++;
Sleep(1000);
}
return 0;
}