Мне нужно запрограммировать простую многопоточную программу на 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;
}
В моем основном классе пользовательского интерфейса у меня есть 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, который является членом моего диалогового класса.
Все работает, но, как только я нажимаю на мой список и, таким образом, запускаю функцию-обработчик, вся программа зависает на неопределенное время. Я попытался использовать обтекание CSingleLock над объектом критической секции, и ничего из этого не сработало. Чего мне не хватает?
РЕДАКТИРОВАТЬ: Я нашел решение, благодаря удивительной проницательности Франси. Это научит меня не помещать каждый бит кода в вопрос. Спасибо!