2014年3月28日14:47:52
使用定时器实现线程控制
1、定时器部分
m_StnCltCtl.initial();
m_StnCltCtl.checkThread();
SetTimer(TIMER_ID_STATION_COLLECT,TIMER_TIME_STATION_COLLECT,NULL);
void CCenterTransDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch(nIDEvent)
{
case TIMER_ID_STATION_COLLECT:
m_StnCltCtl.checkThread();
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
2、线程函数
DWORD WINAPI FWorkThread(void *pVoid)
{
StationClollectThreadPara *pPara = (StationClollectThreadPara *)pVoid;
CString sInfo;
sInfo.Format(_T("线程开始,站ID:%d"),pPara->m_nStationID);
DBG_tWriteLogFile(LOG_DEBUG,sInfo);
for(int i = 0;i<100;i++)
{
pPara->m_bNormal = true;
Sleep(15*1000);
sInfo.Format(_T("线程运行,站ID:%d"),pPara->m_nStationID);
DBG_tWriteLogFile(LOG_DEBUG,sInfo);
}
pPara->m_bAlive = false;
sInfo.Format(_T("线程结束,站ID:%d"),pPara->m_nStationID);
DBG_tWriteLogFile(LOG_DEBUG,sInfo);
return TRUE;
}
bool CStationClollectController::initial()
{
StationClollectThreadPara aPara;
aPara.m_bUse = false;
aPara.m_bAlive = false;
aPara.m_bNormal = false;
aPara.m_nStationID = 0;
for(int i = 0;i<m_nThreadMaxNum;i++)
{
m_listThreadPara.push_back(aPara);
}
return true;
}
bool CStationClollectController::checkThread()
{
list<StationClollectThreadPara>::iterator it = m_listThreadPara.begin();
for(;it != m_listThreadPara.end();it++)
{
if((it->m_bUse)&&(!it->m_bAlive))
{
it->m_bUse = false;
}
if((it->m_bUse)&&(it->m_bAlive))
{
if(it->m_bNormal)
{
it->m_bNormal = false;
}
else
{
//进程自杀
CString sInfo;
sInfo.Format(_T("线程有问题,进程自杀"));
DBG_AfxMessageBox(sInfo);
ExitProcess(0);
return false;
}
}
if(!it->m_bUse)
{
it->m_bUse = true;
it->m_bAlive = true;
it->m_bNormal = true;
it->m_nStationID = g_nStationID;
g_nStationID ++;
HANDLE hThread = CreateThread(NULL,0,FWorkThread,&(*it),0,NULL);
CloseHandle(hThread);
}
}
return true;
}