Hi,All!
Столкнулся с проблемой. В проге создается thread, который заполняет
VSFlexGrid. Параллельно основной поток обрабатывает события от грида. Для
синхронизации поставил critical section. В произвольный момент происходит
зависание. Написал тестики для VSFlexGrid, MSFlexGrid и ListView — все
аналогично. Вот кусок кода для ListView:
int CMultiThreadTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
AfxBeginThread( MyThreadFunction, this ) ;
return 0;
}
UINT MyThreadFunction(LPVOID pParam)
{
CString buf;
CMultiThreadTestView *t = (CMultiThreadTestView *)pParam;
for ( UINT i=0; i<1000; i++ )
{
buf.Format("String %d", i+1);
t->cs.Lock();
CListCtrl &lst = t->GetListCtrl();
Sleep(100); //Чего-то делаем
lst.InsertItem(i, buf);
t->cs.Unlock();
}
return 0;
}
void CMultiThreadTestView::OnMouseMove(UINT nFlags, CPoint point)
{
cs.Lock();
//Чего-то делаем
cs.Unlock();
CListView::OnMouseMove(nFlags, point);
}
После зависания делаю Break в дибагере. Вижу 2 потока. Основной поток в
строке cs.Lock(); а другой — lst.InsertItem.
Поскажите, что не так!