c++ - MFC/CCriticalSection : Simple lock situation hangs

标签 c++ winapi mfc multithreading locking

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

我有一个简单的场景,我有一个工作线程,它执行一个函数:

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 包装,但这些都没有用。我错过了什么?

编辑:感谢 Franci 惊人的洞察力,我找到了解决方案。这将教会我不要将所有代码都放入问题中。谢谢!

最佳答案

您确定后台线程没有在 LockUnlock 之间执行任何SendMessage 到 UI 线程的操作吗?

如果是,它将被阻塞,直到消息队列处理该消息;然而,消息队列永远不会到达它,因为它在处理 ListView 的项目更改通知的过程中被阻塞了。

关于c++ - MFC/CCriticalSection : Simple lock situation hangs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596588/

相关文章:

c++ - 在全屏模式游戏中运行exe文件

c++ - 如何使 Insure++ 与 boost 和 g++ 3.4.x 一起工作

.net - 寻找visual studio.NET C++的各种Windows Form教程

c++ - 无法获取可停靠 Pane C++ 的句柄

c++ - ReadFile lpBuffer 参数

c++ - initializer_list<T> 对 T 的赋值运算符要求

c# - 如何确保启用 Aero 效果?

c++ - 确定 HWND 是否代表顶级窗口的最佳方法是什么?

c++ - 使用 MFC 进行套接字编程

c++ - 如何访问 CMap 中的元素?