我在CListCtrl的OnPaint和工作线程中使用同一CCriticalSection锁:CMeListCtrl::OnPaint()
{
   CriticalSection.Lock();
   ...
   CriticalSection.Unlock();
}
UINT drawthumbnail()
{
   CriticalSection.Lock();
   LVITEM lvitem = {0};
   lvitem.mask = LVIF_IMAGE|LVIF_PARAM;
   GetItem(&lvitem); //运行到此就死锁   ...   CriticalSection.Unlock();  
}我知道GetItem是在等待CMeListCtrl响应,而CMeListCtrl正在Lock(),如果GetItem用PostMessage好像又行不通,因为不能马上获得lvitem。各位此情况该如何变通?

解决方案 »

  1.   

    我知道GetItem是在等待CMeListCtrl响应,而CMeListCtrl正在Lock(),如果GetItem用PostMessage好像又行不通,因为不能马上获得lvitem。各位此情况该如何变通?
    -------------------
    SendMessage()发送消息到主界面线程中去
      

  2.   

    把 GetItem 的函数从临界区中拿出来不行么?原因:GetItem 实际上会执行 SendMessage,导致等待主线程,从而出现死锁。
      

  3.   

    CMeListCtrl::OnPaint()
    {
      CriticalSection.Lock();
      ...
      CriticalSection.Unlock();
    }
    UINT drawthumbnail()
    {
      CriticalSection.Lock();
      LVITEM lvitem = {0};
      lvitem.mask = LVIF_IMAGE|LVIF_PARAM;  pListCtrl->SendMessage(..,(LPARAM)&lvitem);  CriticalSection.Unlock();   
    }GetItem()换成pListCtrl->SendMessage(..,(LPARAM)&lvitem);不会死锁?
      

  4.   

    还是会死锁,你使用临界区保护的是 ListCtrl 的数据吗?如果不是,把 GetItem 放在 lock 之前。
      

  5.   

    死锁的原因是主线程没有释放CriticalSection,需要检查一下主线程阻塞在什么地方。