在通讯程序中开辟了一个线程,这个线程在while循环中,定时更新数据库某个表的字段,代表程序是活动的。
同时执行存储过程,查询是否有表的定义做了修改。在运行中发现,这个表运行一段时间就不更新数据库代表活动的字段了。
但是也没有检测到,线程异常退出什么的,不知道是在读取数据库阻塞住了,还是被挂起了,没有看到线程结束的日志。
DWORD WINAPI ProcScan(LPVOID lpParameter)
{
global_data* p = (global_data*)lpParameter;
while(true)
{
try
{
wRet=WaitForSingleObject(p->handle_notify,1000);
if(p->exit)
{
WriteLog("程序退出");
}
else if(wRet===WAIT_OBJECT_0)
{
WriteLog("程序退出2");
}
//执行存储过程,判断表是否有变动
if(CheckDB())
{
ReadDb(); //读取数据库
}
//////////////////////////////////////////////////////////////////////////////////////////////////
TimeSpan++;
if(TimeSpan>6)
{
KeepAliveStatus(); //更新数据库某个表的字段时间,代表程序运行正常。
}
}
catch(...)
{
WriteLog("线程发生异常");
}
}
WriteLog(“线程正常退出”);
}
------解决思路----------------------
你没有发出挂起的命令,怎么会挂起?
------解决思路----------------------
打日志撒, 每执行一句, 打一个日志, 不工作的时候看执行到哪句, 如果有函数调用 , 再深入进去, 就知道是哪里问题了
------解决思路----------------------
你这线程里面是个死循环吧??
------解决思路----------------------
你这个线程函数,没有看到终止线程的代码,线性一直在while运行着
------解决思路----------------------
KeepAliveStatus();
你在里面干了什么
------解决思路----------------------
线程里面哪能那么些啊,虽然你有退出标志,但线程没有return啊!
DWORD WINAPI ProcScan(LPVOID lpParameter)
{
global_data* p = (global_data*)lpParameter;
while(true)
{
try
{
wRet=WaitForSingleObject(p->handle_notify,1000);
if(p->exit)
{
WriteLog("程序退出");
return 0;
}
else if(wRet===WAIT_OBJECT_0)
{
WriteLog("程序退出2");
return 0;
}
//执行存储过程,判断表是否有变动
if(CheckDB())
{
ReadDb(); //读取数据库
}
//////////////////////////////////////////////////////////////////////////////////////////////////
TimeSpan++;
if(TimeSpan>6)
{
KeepAliveStatus(); //更新数据库某个表的字段时间,代表程序运行正常。
}
}
catch(...)
{
WriteLog("线程发生异常");
}
}
WriteLog(“线程正常退出”);
return 0;
}
------解决思路----------------------
更新函数一次也不执行,还是跑着跑着就不执行了?
你在ReadDb()和KeepAliveStatus()两句后面都加上WriteLog配合日志分析
------解决思路----------------------
个人以为应该是数据库操作出了问题,ReadDb()或者KeepAliveStatus()这两个函数出了问题导致同步卡死得不到返回,线程函数也就卡在那儿了。你仔细检查一下,确保ReadDb()和KeepAliveStatus()在数据库操作上是正确的