多线程问题
我有两个线程,其中一个在运行一段时间后,里面的打印信息不打印日志,不知道为什么?两线程如下:
void* CDateCollect::thCheck(void *param)
{
class CDateCollect* pObj = (class CDateCollect*) param;
int nRetVal;
int nCount=0;
char szPathName[PATH_LEN+NAME_LEN];
bool bNextFlag=1;
//记录核查话单文件结构
struct TicketSerial sTS;
pObj->m_Log->LogAdd("Type[%d] thCheck Start.......",pObj->m_iFileType);
while(!pObj->m_bExitFlag)
{
if(bNextFlag)
{
//遍历检查之前核查失败的文件
// printf("11111111111111111111\n");
list<TicketSerial>::iterator iter;
nRetVal=pObj->m_CheckList.size();
// printf("ZHU: Now Count is [%d]\n",nRetVal);
printf("List of size is %d\n",nRetVal);
for(iter=pObj->m_CheckList.begin();iter!=pObj->m_CheckList.end();)
{
if( (time(NULL)-(*iter).unCreatTime)>=3*SOFDAY)
//if( (time(NULL)-(*iter).unCreatTime)>=600)
{
printf("ZHU: Delete old date [%s]\n",(*iter).szFileName);
iter=pObj->m_CheckList.erase(iter);
printf("ZHU: Delete old date suc!!!!!! [%s]\n",(*iter).szFileName);
}
else
{
memset(szPathName,0,sizeof(szPathName));
pObj->GetFilePath(szPathName,(*iter).szFileName,(time_t)(*iter).unCreatTime);
pObj->m_Log->LogAdd("NOTICE: Type[%d]Get FileName From CheckList [%s]",pObj->m_iFileType,szPathName);
nRetVal = access(szPathName,R_OK);
// printf("222222222222222222222\n");
if(nRetVal==0)
{
pObj->CheckFile(szPathName,*iter);
iter=pObj->m_CheckList.erase(iter);
}
else
iter++;
}
}
//End
//获取要检查的新文件
memset(&sTS,0,sizeof(sTS));
// printf("3333333333333333333333\n");
memset(szPathName,0,sizeof(szPathName));
sTS.iFileType=pObj->m_iFileType;
pObj->GetFileName(sTS);
pObj->GetFilePath(szPathName,sTS.szFileName,(time_t)sTS.unCreatTime);
pObj->m_Log->LogAdd("NOTICE: Type[%d] Get FileName First [%s]",pObj->m_iFileType,szPathName);
bNextFlag=0;
}
//每5s检测一次已经到了生成时间的话单文件
if(nCount++%50!=0||((unsigned int)time(NULL)<sTS.unCreatTime))
{
usleep(4000000);
pObj->m_Log->LogAdd("continue: sTS.unCreatTime[%d] ",sTS.unCreatTime);
continue;
}
// pObj->m_Log->LogAdd("11111111111111111,nCount[%d] ",nCount);
// printf("111111111111111,nCount[%d]\n",nCount);
nCount = 0;
nRetVal = access(szPathName,R_OK);
if(nRetVal==0)
{
// printf("ZHU: [%s] exist, Next \n",szPathName);
pObj->CheckFile(szPathName,sTS);
printf("q2222222222222222222,nCount[%d]",nCount);
bNextFlag=1;
}
else
{
//待检查文件超过设定时间没有检查到,则插入到待查询队列,等下次查询
// printf("ZHU: Start:[%u] End:[%u] CreatTime[%u] TimeIntv[%d]\n",((unsigned int)time(NULL)-sTS.unCreatTime),(unsigned int)((pObj->m_nTimeIntv-2)*60),
// sTS.unCreatTime,pObj->m_nTimeIntv);
// printf("33333333333333333333333,nCount[%d]",nCount);
// pObj->m_Log->LogAdd("22222222222222222222,Time[%d] ",(unsigned int)time(NULL)-sTS.unCreatTime);
// pObj->m_Log->LogAdd("22222222222222222222,sTS.unCreatTime[%d] ",sTS.unCreatTime);
if( ((unsigned int)time(NULL)-sTS.unCreatTime)>=(unsigned int)((pObj->m_nTimeIntv-2)*60) )
{
nRetVal=pObj->m_Ora[OP_001]->InsertRecord((void*)&sTS);
if(nRetVal!=0)
{
pObj->m_Log->LogAdd("ERROR: Type[%d] Insert unsuc[%s] into ticketserial_tab failed! ECode[%d]",pObj->m_iFileType,sTS.szFileName,nRetVal);
}
else
pObj->m_Log->LogAdd("NOTICE: Type[%d] Insert unsuc[%s] into ticketserial_tab suc!",pObj->m_iFileType,sTS.szFileName);
pObj->m_Log->LogAdd("WARN: Type[%d] [%s] not exist! Insert CheckList for next check",pObj->m_iFileType,sTS.szFileName);
pObj->m_CheckList.push_back(sTS);
bNextFlag=1;
}
}
}//End
pObj->m_Log->LogAdd("Type[%d] thCheck Exit.......",pObj->m_iFileType);
return (void*)0;
}
第二个:
void* CProcess::thProcess(void *param)
{
class CProcess* pObj= (class CProcess*) param;
int nRetVal,nFetchOKNum,nTimeNum;
TicketErr* pTE= new TicketErr[MAX_FETCH_NUM];
char* szRowID= new char[MAX_FETCH_NUM*MAX_ROWID_LEN];
while(!pObj->m_bExitFlag)
{
int nKeyValue=0;
printf("11111111111111111111111\n");
nRetVal=pObj->m_oOraTE->SelectRecord(3,(void*)&nKeyValue);
//nRetVal=pObj->m_oOraTE->SelectRecord();
if(nRetVal==ERR_OCI_BT_CONNECTERR)
{
//数据库重连
printf("22222222222222222222222222222222\n");
pObj->m_oLog->LogAdd("ERROR: Connect Oracle Fialed! Try To Connect Again!");
pObj->DestroyDB();
nRetVal=pObj->InitDB();
while(nRetVal!=0)
{
printf("333333333333333333333333\n");
sleep(10);
pObj->DestroyDB();
nRetVal=pObj->InitDB();
pObj->m_oLog->LogAdd("ERROR: Connect Oracle Fialed! ECode[%d] Try To Connect Again!",nRetVal);
}
pObj->m_oLog->LogAdd("NOTICE: Connect Oracle Suc!");
}
else if(nRetVal!=0)
{
printf("4444444444444444444444\n");
pObj->m_oLog->LogAdd("ERROR: pObj->m_oOraTE->SelectRecord Failed! ECode[%d]",nRetVal);
}
else
{
printf("555555555555555555555\n");
nRetVal=pObj->m_oOraTE->FetchRecord((void*)pTE,szRowID,MAX_FETCH_NUM,sizeof(TicketErr),(int*)&nFetchOKNum);
// pObj->m_oLog->LogAdd("ERROR OF NUMBER IS [%d]",nFetchOKNum);
if(!(nRetVal==0||
(nRetVal==1&&nFetchOKNum>0)))
{
printf("6666666666666666666666\n");
usleep(100);
}
else
{
for(int i=0;i<nFetchOKNum;i++)
{
printf("7777777777777777777777\n");
// printf("ZHU: CreatTime: %u Level: %d szWarunMsg: %s sTatus: %d\n",pTE[i].unCreatTime,
// pTE[i].iLevel,pTE[i].szWarnMsg,pTE[i].cStatus);
nRetVal=pObj->SendTO(&pTE[i]);
if(nRetVal<0)
pObj->m_oLog->LogAdd("ERROR: pObj->SendTO Failed! ECode[%d]",nRetVal);
pTE[i].cStatus=1;
nRetVal= pObj->m_oOraTE->UpdateRecord(&pTE[i],szRowID+19*i,1,false);
if(nRetVal!=0)
{
printf("88888888888888888888\n");
pObj->m_oLog->LogAdd("ERROR: pObj->m_oOraTE->UpdateRecord Failed! ECode[%d]",nRetVal);
}
}
}//else
}
ArrayList sList;
if(pObj->m_oClient->GetConnectInfo(sList)==0)
{
printf("aaaaaaaaaaaaaaaaaaaaaaa\n");
pObj->m_oLog->LogAdd("ERROR: Connect Center Failed! Check Center!");
}
else
sList.RemoveAll();
while(nTimeNum++%50!=0)
{
printf("9999999999999999999\n");
usleep(100);
}
}//While
printf("$$$$$$$$$$$$$$$ quit \n");
return (void*)0;
}