当前位置: 代码迷 >> VC/MFC >> 线程是被挂起还是被阻塞住了 怎么判断?
  详细解决方案

线程是被挂起还是被阻塞住了 怎么判断?

热度:93   发布时间:2016-05-02 03:36:59.0
线程是被挂起还是被阻塞住了 如何判断???
 在通讯程序中开辟了一个线程,这个线程在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(); 
你在里面干了什么
------解决思路----------------------
引用:
Quote: 引用:

你这个线程函数,没有看到终止线程的代码,线性一直在while运行着


主动退出时,会告诉线程退出标志。

问题是,更新函数不执行了。是否由于某个异常抛出,导致线程不工作了。但是都没有监测到日志产生。

线程里面哪能那么些啊,虽然你有退出标志,但线程没有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()在数据库操作上是正确的
  相关解决方案