Проблемы с CCriticalSection
От: AndreyPavlov  
Дата: 01.08.06 05:38
Оценка:
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.
Поскажите, что не так!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.