rap*_*ard 0 c++ winapi mfc multithreading locking
我必须使用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;
}
Run Code Online (Sandbox Code Playgroud)
在我的主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;
}
Run Code Online (Sandbox Code Playgroud)
两个函数中的searcherLock是同一个对象.工作线程函数传递一个指向CCriticalSection对象的指针,该对象是我的对话框类的成员.
一切正常,但是,只要我点击我的列表,并因此触发处理程序功能,整个程序无限期挂起.我尝试使用Cmutex.我尝试使用CSingleLock包装在关键部分对象上,但这些都没有奏效.我错过了什么?
编辑:由于Franci的惊人洞察力,我找到了解决方案.这将教会我不要把所有代码都放在问题中.谢谢 !
你确定后台线程没有SendMessage对Lock和之间的UI线程做任何事Unlock吗?
如果是,它将被阻塞,直到消息队列处理该消息; 但是,消息队列永远不会到达它,因为它在处理列表视图的项目更改通知的过程中被阻止.