程序运行两天两夜,出现了假死现象,高手请进

jjiaming jjiaming 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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就会使主线程严重堵塞(但程序还能运行),不知小弟这样分析对不对,然后请大家看一下这两段代码有什么不对的地方,如果确实是这里出了问题,那出现多个发送连续超时的原因又是什么呢?小弟敬候高手的到来
...全文
评论 16
收藏 已收藏
分享
返回顶部
jjiaming
网络编程 18,356 成员 64,161 内容