自己定义了一个继承CWinThread的类,并为该线程类添加了一个自定义消息实现后台加载图片数据,当图片数据还没有加载完我就关闭了应用程序,在析构函数中我调用了以下代码来结束线程:                  if(m_lpThread)
{
HANDLE hThread = m_lpThread->m_hThread;
DWORD  nThreadID = m_lpThread->m_nThreadID;
if(hThread)
{
::PostThreadMessage(nThreadID,WM_QUIT,0,0);
::WaitForSingleObject(hThread,INFINITE);//代码在这里阻塞
}
}但每次运行到WaitForSingleObject的时候总是阻塞,没能正常结束线程??我这样的写法有问题吗? 下面是我写的继承CWinThread的类的代码:
CMyThread::CMyThread() : CWinThread()
{
m_bAutoDelete = FALSE;
}
CMyThread::~CMyThread()
{
}BOOL CMyThread::InitInstance()
{
return TRUE;
}
int CMyThread::ExitInstance()
{
int res =  CWinThread::ExitInstance();
Delete();
return res;
}

解决方案 »

  1.   

    发送消息后,发送消息函数会马上返回。而线程并不会马上响应该消息,所以会阻塞在Wait函数。代码是没问题的。
      

  2.   

    我继承的线程类只是添加了一个自定义消息用于加载图片,函数如下:
    void LoadImg()
    {
        CString fullPath;
        for (int i = 0; i < m_max; i++)
        {
             fullPath = m_vFiles.at(0);
             Bitmap *temImg = new Bitmap(fullPath.AllocSysString());
             m_saveImg.Add(temImg);//CPtrArray
        }
    }
    当图片比较多的时候,这个函数还没执行完我就把程序关掉就会阻塞
      

  3.   

    调试下断点
    int CMyThread::ExitInstance()
    {
    int res = CWinThread::ExitInstance();
    Delete();
    return res;
    }
    先看函数ExitInstance是否执行了
      

  4.   

    CWinThread* m_lpThread = NULL; // 成员变量// 创建UI线程
    if(NULL == m_lpThread)
    {
    m_lpThread = AfxBeginThread(RUNTIME_CLASS(CNewWinThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL);
    ASSERT(NULL != m_lpThread);
    m_lpThread->m_bAutoDelete = FALSE;
    m_lpThread->ResumeThread();
    }
    // 销毁UI线程
    if((NULL != m_lpThread) && (NULL != m_lpThread->m_hThread))
    {
    m_lpThread->PostThreadMessage(WM_QUIT, 0, 0);
    WaitForSingleObject(m_lpThread->m_hThread, INFINITE);
    delete m_lpThread;
    m_lpThread = NULL;
    }
      

  5.   

    楼主,弱弱的问一句m_lpThread->m_hThread这个值在你前后执行m_lpThread->PostThreadMessage(WM_QUIT, 0, 0);
    会有变化么?如果没有变化,还是自己再加个CEvent互斥下看看吧
      

  6.   

    我是给线程发自定消息的时候把this指针传进去,然后用这个指针访问LoadImg函数来加载图片的
      

  7.   


    晕喽!
    界面线程操作主线程,造成死锁,无限等待!
    用MsgWaitfor..来等待线程返回吧
      

  8.   


    我是在主线程析构函数中调用::PostThreadMessage(nThreadID,WM_QUIT,0,0);来告诉子界面线程退出,这样不算是界面线程操作主线程吧,第一个参数不是指明了子线程的id吗,难道说是因为我在消息中用传进去的this访问外部函数就变成了在主线程中执行?
      

  9.   

    感谢大家的回复,虽然我依然找到为什么没法正常结束线程,但是我采用另一种方法就可以了,这里跟大家分享下:
    HANDLE hThread = m_lpThread->m_hThread;
    DWORD  nThreadID = m_lpThread->m_nThreadID;
    if(hThread)
    {
    ::PostThreadMessage(nThreadID,WM_QUIT,0,0);
    while  (TRUE)   
    {
    DWORD   result ;
    MSG   msg   ;    
    BOOL flag = FALSE;
    while   (PeekMessage(&msg,   NULL,   0,   0,   PM_REMOVE))     
    {//防止主线程卡死  
    if(msg.message == WM_QUIT)
    return; DispatchMessage(&msg);  
    }   result = MsgWaitForMultipleObjects(1, &hThread, FALSE, INFINITE, QS_ALLINPUT);
    if(result == WAIT_OBJECT_0)
    {
    break;
    }
    else
    {
    continue;
    }

    }