我必须使用 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 惊人的洞察力,我找到了解决方案。这将教会我不要将所有代码都放入问题中。谢谢!
最佳答案
您确定后台线程没有在 Lock
和 Unlock
之间执行任何SendMessage
到 UI 线程的操作吗?
如果是,它将被阻塞,直到消息队列处理该消息;然而,消息队列永远不会到达它,因为它在处理 ListView 的项目更改通知的过程中被阻塞了。
关于c++ - MFC/CCriticalSection : Simple lock situation hangs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596588/