程序运行两天两夜,出现了假死现象,高手请进
RT,运行两天两夜后,发现程序响应很慢,但是还没有挂掉,而且发现这期间数据库里的内容也发生了改变,说明程序还在运行。小弟只好把程序检查一遍,程序中没有费时的操作和计算,只有主进程有一个WaitForSingleObject(),于是怀疑是这里导致的。现将相关代码贴出:
volatile bool bStop;//线程终止标志
volatile CEvent eventEnd;//发送结束事件
volatile SENDINFO SendInfo;//待发送数据的结构体
volatile CEvent eventSend;//有数据要发送事件
//发送线程
DWORD WINAPI SendThread(LPVOID DataPoint)
{
CMainCtrl* MainCtrl = (CMainCtrl*) DataPoint;
CServerTunnel* ServerTunnel = &(MainCtrl->m_tServerTunnel);
while(!bStop)
{
if(::WaitForSingleObject(eventSend.m_hObject,2000) != WAIT_OBJECT_0)
continue;//检测是否有数据要发送
if(MainCtrl->pBuf == NULL)
{
ResetEvent(eventSend.m_hObject);
SetEvent(eventEnd.m_hObject);
continue;
}
long a= ServerTunnel->net_Send(SendInfo.hSocket,SendInfo.wMessageID,
MainCtrl->pBuf,SendInfo.BufLen);
if(a != SendInfo.BufLen + MESSAGE_HEADER_LEN)
TRACE("注意,发送的字节数不对,发送数%d ,待发送数%d\n",a,SendInfo.BufLen);
ResetEvent(eventSend.m_hObject);
SetEvent(eventEnd.m_hObject);
}
return 1;
}
//发送数据的函数
unsigned long CMainCtrl::net_Send(SOCKET hSocket,DWORD wMessageID, char* pSendBuf ,int length)
{
Sleep(15);
if(::WaitForSingleObject(eventEnd.m_hObject,2000) != WAIT_OBJECT_0)
{//发送超时
bStop = false;
TRACE("发送超时!!");
TerminateThread(ThreadHandle,0);//杀死超时线程
ThreadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SendThread,(LPVOID*)this,0,&ThreadId); //新建发送线程
TRACE("创建了一个新的线程");
}
ResetEvent(eventEnd.m_hObject);
SendInfo.m_tServerTunnel = &m_tServerTunnel;
SendInfo.hSocket = hSocket;
SendInfo.wMessageID = wMessageID;
if(pBuf != NULL)
delete[] pBuf;
pBuf = new char[length];
memcpy((void*)pBuf,pSendBuf,length);
SendInfo.BufLen = length;
SetEvent(eventSend.m_hObject);//有数据要发送
return 1;
}
程序以前偶尔过发送超时的问题,所以WaitForSingleObject堵塞的机会不大,时间也比较短,但是如果发生多个发送连续超时,这样WaitForSingleObject就会使主线程严重堵塞(但程序还能运行),不知小弟这样分析对不对,然后请大家看一下这两段代码有什么不对的地方,如果确实是这里出了问题,那出现多个发送连续超时的原因又是什么呢?小弟敬候高手的到来