本文共 1741 字,大约阅读时间需要 5 分钟。
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::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;}
转载地址:http://vjwci.baihongyu.com/