class CMainDlg : public CDialog
{
    CMyListCtrl m_listctrl;

对话框的Onclose触发时会通知并等待线程退出
CMainDlg::OnClose()
{
SetEvent(m_event);
if(WaitForSingleObject(g_htread,INFINITE/*5000*/)==WAIT_TIMEOUT )
   {
   //...
    }
}线程函数:
DWORD WINAPI ThreadFun(PVOID lpParam )
{
CMainDlg* pDlg = ( CMainDlg* )lpParam ;
while(WaitForSingleObject(m_hProcessThreadEvent,2)==WAIT_TIMEOUT) 
{
          //....
          pDlg->m_listctrl.SetItemText(1,2,"aaa");  
         //...       
         }
return 0 ;
}
当调用m_listctrl.SetItemText或者m_listctrl.GetItemData线程就会一直卡在这里,被一直挂起,使得线程函数ThreadFun不能正常return退出。
貌似CListCtrl内部调用VERIFY(::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)&lvi));时一直无返回。

解决方案 »

  1.   

    你把OnClose中改成一个循环,不要无限等待,循环执行等待函数和PeekMessage就可以了。
      

  2.   

    死锁很正常啊你在线程ThreadFun调用SetItemText函数,而SetItemText内部实现又是通过SendMessage LVM_SETITEMTEXT消息来实现的线程往ThreadFun主线程发消息LVM_SETITEMTEXT,用的是SendMessage,需要等待主线程处理完毕才能返回
    而主线程又在等待线程结束,无法处理这个消息,两个线程相互等待相互锁住了。