gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:31:00 26 4
gpt4 key购买 nike

我必须使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com