结构是这样的,在View里面创建了两个线程 m_SqlThread,CYDSendThread。负责操作数据库和SOCKET。两个线程都继承自 CWinThread,
结构都是BOOL InitInstance()
{
   ////在操作socket的线程里,这里创建了两个SOCKET,是继承CAsyncSocket的
   while(CGateView.m_StateFlag)
   {
        ////做事情
   }
   return true;
}
下面是窗口关闭前调用的,但有时候会没用,虽然窗口关了,但程序还在任务栏列表里面。
void CGateView::DoBeforeClose() 
{
m_StateFlag=FALSE; 
::Sleep(2000);

if(m_SqlThread.m_hThread)
{
m_SqlThread.SuspendThread();
}


pThread->SuspendThread();//操作socket的线程 CYDSendThread

pThread->m_pSendSocket[0]->Close();
pThread->m_pSendSocket[1]->Close();

m_YdSendList.RemoveAt(tmp);
delete pThread;
pThread = NULL;

Sleep(1000);
}

解决方案 »

  1.   

    m_SqlThread.ExitInstance()
    pThread.ExitInstance()
      

  2.   

    退出线程你只需要退出while循环即可。
    在主线程中调用Close或ExitInstance之类的函数是无法退出工作线程的
      

  3.   

    在while循环中使用WaitforSingleObject等待一个事件
    主线程使该事件受信即可
      

  4.   


    WaitforSingleObject 跟while(m_StateFlag)不一样吗?
      

  5.   

    不一样while不会阻塞自己,且高速循环,占用CPU资源太大了。
    WaitforSingleObject 可以阻塞自己
      

  6.   

    使用while,肯定也是可以的最好调试一下看看,退出窗口后,进程停滞后,暂停一下,看一下线程及调用堆栈,查看一下位置。
      

  7.   

    我认为这是对的,应该用WaitforSingleObject 
      

  8.   

    最好是加锁(互斥)+标志量的方式只用标志量时,万一while(){}里的事情还没做完,这时虽然将标志量进行了设置,但while()是没有进行检测的所以线程里用
    for(;;)
    {
      WaitforSingleObject()//加锁,互斥
      if(m_StateFlag)
      release()//释放锁,重置事件
    }控制处用
    m_StateFlag=false//设置标志量
    WaitforSingleObject()//加锁,互斥
    release()//释放锁,重置事件这样,线程肯定会退出
      

  9.   

    结构是这样的,在View里面创建了两个线程 m_SqlThread,CYDSendThread。负责操作数据库和SOCKET。
    两个线程都继承自 CWinThread,

    既然是继承自CWinThread,那么就应该是UI线程乐,可是看你的代码BOOL InitInstance()
    {
      ////在操作socket的线程里,这里创建了两个SOCKET,是继承CAsyncSocket的
      while(CGateView.m_StateFlag)
      {
      ////做事情
      }
      return true;
    }把他们当成工作组线程了,而且还不如工作组线程呢,因为UI线程的InitInstance是启动初始化的虚函数,你直到要把整个程序都退出的时候才让这个函数运行完,UI线程这时候还要转去处理线程消息队列,应该不会马上结束线程的,而且在InitInstance函数结束之前,线程是无法响应诸如:SuspendThread等要求的
      

  10.   

    SuspendThread是可以响应的吧,InitInstance完了线程就结束了。代码不是我写的,现在已经没办法改线程类型了。
      

  11.   

    ===========还有个问题,就是在InitInstance结束后,线程OVER了,那线程申请的对象,比如SOCKET,会自动释放掉吗?