Hi Fons, Thanks for replying so quickly, your fast response is really appreciated. Calling gSystem->ProcessEvents() at the appropriate time solved the problem (which only occurred at when trying to add entries at high rates). I have a related question. To limit the size of the ListBox I restrict the number of entries to some fixed number (e.g. 1000). When this number is exceeded the 10 entries at the bottom of the list are removed using fListBox->RemoveEntries() This causes problems in TGListBox::Layout() - the screen TGListBox window momentarily goes white. Stepping through in the debugger I find that this occurs when container->Resize(cw,tch) is called from TGListBox::Layout() the size of the container. It looks like there is some mismatch between the viewport position/scrollbar position and container size. Things are fine after the ProcessEvents but this causes an annoying screen flicker. Any suggestions ? cheers, Mark. fListBox->AddEntry(pLBT2,fLayout); if(_iListBoxEntry>_nDepth)iCount++; if(_iListBoxEntry>_nDepth)fListBox->RemoveEntry(_iListBoxEntry-_nDepth); if(iCount==_nKillEntries){ nCount++; fListBox->RemoveEntries((nCount-1)*_nKillEntries+1,nCount*_nKillEntries); iCount =0; } int nThatFit =fListBox->GetHeight()/(pLBT2->GetHeight()+1+fLayout->GetPadTop()+fLayout->GetPadBottom()) ; fListBox->MapSubwindows(); fListBox->Layout(); if(_iListBoxEntry>nThatFit)fListBox->SetTopEntry(_iListBoxEntry-nThatFit); gSystem->ProcessEvents(); p.s. I use fListBox->RemoveEntries() since it is much faster than the correspoding multiple calls to fListBox->RemoveEntry(). On Mon, 13 Aug 2001, Fons Rademakers wrote: > Hi Mark, > > in principle what you do is correct. However, are you returning after this > code snipped back into the event loop or are you continuing some lengthy > calculation. Remember, the GUI gets only refresh when it gets back to the > event loop. You can force this by calling gSystem->ProcessEvents() once > in a while when in a tight calculating loop. > > Cheers, Fons. > > > > Mark Thomson wrote: > > > > Dear Rooters, > > > > I've written a simple GUI application to display logging messages based on > > the TGListBox class. On the whole things work fine. However I have a problem > > which causes the screen updates to be rather jittery: > > > > 1) How do I force the window to redraw immediately after I add a > > new entry. I had expected the new TGTextLBEntry to be drawn > > immediately after the code (see below) has been executed - it > > doesn't. > > > > What am I doing wrong ? How do I force the listbox and entry to be > > drawn after adding each TGTextLBEntry. > > > > cheers, > > Mark Thomson > > > > // Make the new entry - associate it with the LB container > > TGTextLBEntry* pLBT2 = new TGTextLBEntry(fListBox->GetContainer(), > > pString,++_iListBoxEntry, > > theGC, theFont, > > kHorizontalFrame,backColor); > > TGLayoutHints* fLayout = new TGLayoutHints(kLHintsLeft|kLHintsTop|kLHintsExpandX, > > 1, 0, 0, 1 ); > > > > // NOTE the list box adopts pLBT2 and fLayout > > // Add the entry and try to display it > > fListBox->AddEntry(pLBT2,fLayout); > > fListBox->MapSubwindows(); > > fListBox->Layout(); > > // Scroll so that new entry is at the bottom of the screen > > int nThatFit = fListBox->GetHeight()/(pLBT2->GetHeight()+ > > fLayout->GetPadTop()+fLayout->GetPadBottom()); > > > > if(_iListBoxEntry>nThatFit)fListBox->SetTopEntry(_iListBoxEntry+1-nThatFit); > > -- > Org: CERN, European Laboratory for Particle Physics. > Mail: 1211 Geneve 23, Switzerland > E-Mail: Fons.Rademakers@cern.ch Phone: +41 22 7679248 > WWW: http://root.cern.ch/~rdm/ Fax: +41 22 7677910 >
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:57 MET