您的位置:首页 > 其它

使用定时器实现线程控制

2014-03-28 14:52 337 查看
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;
}


3、线程控制函数
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: