Автор
|
Тема: Парсинг данных с синхронной отрисовкой
|
lkv |
опубликован 28-05-2001 23:43 MSK
Здравствуй, о всезнающий All!!! У меня тут проблемка маленькая...Надо получать данные в цикле СData::runCommandFile и одновременно отрисовывать их (CView::OnDraw)... и что-то такая фигня получается..., даже в разных threads. Не подкинете ли работающий пример... (Желательно на VC) Спасибо за внимание. С наилучшими пожеланиями, Константин.
|
OlegN
|
опубликован 29-05-2001 13:57 MSK
Все зависит от того, как часто (с какими временными промежутками) ты хочешь читать СData::runCommandFile и обновлять CView::OnDraw Если это нужно нечасто (5-10 раз в секунду и реже), то используй оконный таймер для получения данных и InvalidateRect для перерисовки нужного региона окна. Приблизительно так : void CMyView::OnTimer(UINT nIDEvent ) { bool bContinueRead = (m_CurDataIndex < MaxDataIndex); // определить продолжать ли обновление if(!bContinueRead) KillTimer(nIDEvent) else { // Получаем следующий елемент m_myData->GetNextData(m_CurDataIndex++) CRect NewDataRect = // вычисляем прямоугольник, где будут отрисованы новые данные // устанавливаем регион, который необходимо перерисовать InvalidateRect(NewDataRect, TRUE); } }void CMyView::StartTimer() { MaxDataIndex = 100; m_CurDataIndex = 0; SetTimer(MyTimerID, 100, 0); // обновление 10 раз в секунду } Ну еще в Message map нужно добавить ON_WM_TIMER( )
|
lkv
|
опубликован 29-05-2001 19:54 MSK
нужно часто... формат файла (размер ~ тысячи строк):command1; [pause nnn;] command2; [pause mmm;] ... вызываю в цикле OnPaint..., а перерисовка не происходит!!! Окно остается белым!!! Но если по нему повозить сверху другим, то можно увидеть, что перерисовка все-таки идет... |
al
|
опубликован 29-05-2001 20:08 MSK
InvalidateRect только говорит системе "когда у тебя будет свободное время, пошли этому окну WM_PAINT". В Вашем случае такого времени - нет. Выход - после InvalidateRect вызывать функцию UpdateWindow |