我必须使用MFC / C ++编写一个简单的线程程序以进行单项分配。

我有一个简单的场景,我有一个工作线程,它按照以下方式执行功能:

UINT createSchedules(LPVOID param)
{
  genProgThreadVal* v = (genProgThreadVal*) param;
  // v->searcherLock is of type CcriticalSection*
  while(1)
  {
    if(v->searcherLock->Lock())
    {
      //do the stuff, access shared object , exit clause etc..
      v->searcherLock->Unlock();
    }
  }
  PostMessage(v->hwnd, WM_USER_THREAD_FINISHED , 0,0);
  delete v;
  return 0;
}


在我的主UI类中,我有一个CListControl,希望它能够访问共享对象(类型为std :: List)。因此,锁定的东西。因此,此CList具有一个处理程序函数,如下所示:

void Ccreationprogramme::OnLvnItemchangedList5(NMHDR *pNMHDR, LRESULT *pResult)
{
  LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  if((pNMLV->uChanged & LVIF_STATE)
    && (pNMLV->uNewState & LVNI_SELECTED))
  {
    searcherLock.Lock();
    // do the stuff on shared object
    searcherLock.Unlock();

    // do some more stuff
  }
  *pResult = 0;
}


这两个函数中的searcherLock是同一对象。辅助线程函数传递了一个指向CCriticalSection对象的指针,该对象是我的对话框类的成员。

一切正常,但是只要我点击列表并触发处理程序功能,整个程序就会无限期挂起。我尝试使用Cmutex。我尝试在关键部分对象上使用CSingleLock包装,但是这些都没有起作用。我想念什么?

编辑:由于弗朗西的惊人见解,我找到了解决方案。那会教我不要将所有代码都放入问题中。谢谢 !

最佳答案

您确定后台线程没有对SendMessageLock之间的UI线程执行Unlock的任何操作吗?

如果是这样,它将被阻止,直到消息队列处理该消息为止。但是,消息队列将永远无法到达它,因为它在处理列表视图的项目更改通知时被阻塞。

关于c++ - MFC/CCriticalSection:简单的锁定情况挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2596588/

10-11 19:18
查看更多